Permalänk
Medlem

php, charset och olika språk

Har utvecklat ett språkval till en site och det enda som återstår är frågetecken som dyker upp i texten på speciella bokstäver.
De olika språken är svenska, finska, spanska och engelska. Ingen interaktion mellan databas utan det genereras fram i olika php-filer.

  • Charset är satt till utf-8.

  • Kodat i ANSI

  • Dokumentet är XHTML 1.0 Transitional

  • Wampserver med PHP 5.3.0

Bokstäver så som,

å, ä, ö, ó

är de som påverkas.

Vad har jag missat här? Snabbt svar uppskattas stort!

Visa signatur

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com

Permalänk
Medlem

Lite vag beskrivning för att jag helt ska greppa..
Men kolla på utf8_encode/utf8_decode funktionerna och använd dem när du hämtar/sparar data.

Permalänk
Medlem
Skrivet av fiffy:

Lite vag beskrivning för att jag helt ska greppa..
Men kolla på utf8_encode/utf8_decode funktionerna och använd dem när du hämtar/sparar data.

Underbart, det var det jag missat. Tack!

Visa signatur

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com

Permalänk
Medlem
Skrivet av fiffy:

Lite vag beskrivning för att jag helt ska greppa..
Men kolla på utf8_encode/utf8_decode funktionerna och använd dem när du hämtar/sparar data.

Detta används för att kringgå databasens egen encoding och är, anser jag, ett nödtvång som inte ska användas om man själv administrerar databasen. Ungefär som att använda ä för att representera bokstaven ä i HTML.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Detta används för att kringgå databasens egen encoding och är, anser jag, ett nödtvång som inte ska användas om man själv administrerar databasen. Ungefär som att använda ä för att representera bokstaven ä i HTML.

Tack, bra kuriosa att veta. I mitt fall tror jag det är den bättre lösningen i och med att det i dagsläget inte finns en databas, utan texterna är lagrade i arrayer. Främst för att det är sån liten mängd text. Eller kanske det finns ett snyggare sätt att lösa det på?

Visa signatur

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com

Permalänk
Medlem

Oj, läste godtyckligt verkar det som
Är filerna sparade med UTF-8-encoding också så borde det fungera. Tycker definitivt att det är värt att kolla på, annars är det i stort sett meningslöst att använda sig av charset utf-8.

edit: jag är trött. Du skriver att de genereras fram så jag förmodar att de helt enkelt skapas utan rätt encoding.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Oj, läste godtyckligt verkar det som
Är filerna sparade med UTF-8-encoding också så borde det fungera. Tycker definitivt att det är värt att kolla på, annars är det i stort sett meningslöst att använda sig av charset utf-8.

edit: jag är trött. Du skriver att de genereras fram så jag förmodar att de helt enkelt skapas utan rätt encoding.

Hehe har varit likadan den här veckan. Det har du antagligen rätt i, så något åt det här hållet så borde det vara fit for fight:

public static function to_utf8($in) { if (is_array($in)) { foreach ($in as $key => $value) { $out[to_utf8($key)] = to_utf8($value); } } elseif(is_string($in)) { if(mb_detect_encoding($in) != "UTF-8") return utf8_encode($in); else return $in; } else { return $in; } return $out; }

Alternativt exempel om man har en specifik output och inte behöver iterera så mycket strängar:

for ($row = 0; $row < count($dbarray); $row++) { echo utf8_encode($dbarray[$row]["Key"]); }

Visa signatur

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com

Permalänk
Medlem
Skrivet av save:

Hehe har varit likadan den här veckan. Det har du antagligen rätt i, så något åt det här hållet så borde det vara fit for fight:

public static function to_utf8($in) { if (is_array($in)) { foreach ($in as $key => $value) { $out[to_utf8($key)] = to_utf8($value); } } elseif(is_string($in)) { if(mb_detect_encoding($in) != "UTF-8") return utf8_encode($in); else return $in; } else { return $in; } return $out; }

Alternativt exempel om man har en specifik output och inte behöver iterera så mycket strängar:

for ($row = 0; $row < count($dbarray); $row++) { echo utf8_encode($dbarray[$row]["Key"]); }

utf8_encode/_decode av- och påkodar bara ISO-8859-1. Det är det som gör det till en så knäpp lösning (och en av många anledningar till att PHP är ett så bloatat språk) enligt mig. Om alla dina filer är i utf-8 så ska problemet inte uppstå. Har källan en annan encoding så fungerar det bara om den är iso-8859-1, annars löper du risk att få en ny sorts skräp istället. Windows-1252 är ett exempel på en relativt vanlig encoding som inte fungerar. Andra ISO-8859-X får samma problem.

Jag skulle ha sett till att alla datakällor – filer, databaser, whatever – använder sig av utf-8, eller skita i det och köra ISO-8859-1.

[quote=någon på php.net]Note that you should only use utf8_encode() on ISO-8859-1 data, and not on data using the Windows-1252 codepage. Microsoft's Windows-1252 codepage contains ISO-8859-1, but it includes several characters in the range 0x80-0x9F whose codepoints in Unicode do not match the byte's value (in Unicode, codepoints U+80 - U+9F are unassigned).

utf8_encode() simply assumes the bytes integer value is the codepoint number in Unicode.

E.g. in 1252, byte 0x80 is the euro sign, which is U+20AC. The same goes for curly quotes, em dashes, etc.

utf8_encode() will convert 0x80 into U+0080 (an unassigned codepoint) rather than U+20AC.

To convert 1252 to UTF-8, use iconv, recode or mbstring.[/quote]

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

utf_encode/_decode av- och påkodar bara ISO-8859-1. Det är det som gör det till en så knäpp lösning (och en av många anledningar till att PHP är ett så bloatat språk) enligt mig. Om alla dina filer är i utf-8 så ska problemet inte uppstå. Har källan en annan encoding så fungerar det bara om den är iso-8859-1, annars löper du risk att få en ny sorts skräp istället. Windows-1252 är ett exempel på en relativt vanlig encoding som inte fungerar. Andra ISO-8859-X får samma problem.

Jag skulle ha sett till att alla datakällor – filer, databaser, whatever – använder sig av utf-8, eller skita i det och köra ISO-8859-1.

Oh då är jag med! Gah.. jag hade förstås inte valt att konvertera dokumenten innan jag valde att koda i utf-8 i Notepad++. Japp, trött är man. Tack för nyttig input som vanligt Tekno

Visa signatur

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com