2011-01-03 10 views
2

Ich habe ein Problem mit einigen Zeichen wie "í" oder "ñ" in einem Webprojekt mit PHP und MySQL arbeiten.Ein weiteres Zeichenproblem mit PHP und MySQL

Die Datenbanktabelle ist in UTF-8-Zeichensatz und die Webseite ist ISO-8859-1 (Latin-1). auf den ersten Blick wird alles gut behandelt, aber ein Problem tritt auf, wenn ich die JSON_ENCODE-Funktion von PHP verwende.

Wenn ich ein Abfrageergebnis zu erhalten, lassen Sie uns sagen, diese Zeile:

| ID | VALUE | 
-------------------- 
| 1 | Línea | 

Ich habe die folgenden (korrekt) Array in PHP:

Array("ID"=>"1","VALUE"=>"Línea"); 

So weit, so gut. Aber, wenn ich die json_encode gelten

$result = json_encode($result); 
//$result is {"id":"1","value":"L"} 

Dann habe ich versucht, einige Codierung/Decodierung, aber ich konnte nicht das richtige Ergebnis bekommen.

Zuerst habe ich versucht, die UTF-8-Zeichen wie folgt zu entschlüsseln:

$result['value'] = utf8_decode($result['value']); 
//and I get $result['value'] is "L?a" 

Dann habe ich versucht mit mb ​​Funktionen:

$result['value'] = mb_convert_encoding($result['value'],"ISO-8859-1","UTF-8"); 
//and I get that $result['value'] is "Lnea" 

Ich weiß nicht wirklich, warum die json_encode meine brechen String und ich kann nicht herausfinden, was ich noch versuchen soll. Ich werde jede Hilfe zu schätzen :)

Vielen Dank!

Antwort

2

Die documentation für json_encode besagt, dass die Funktion nur auf UTF-8-Daten funktioniert. Wenn es nicht für Sie funktioniert, bedeutet dies, dass Ihre Daten nicht UTF-8 sind.

Um zu verstehen, was schief läuft, müssen Sie wissen, was Ihre connection character set ist. Ist es UTF-8? Etwas anderes? Verwenden Sie SET NAMES utf-8 und sehen Sie, ob es einen Unterschied macht.

Angenommen, die Verbindung Zeichensatz ist in der Tat UTF-8, json_encode sollte gut funktionieren. Dann haben Sie immer noch das letzte Problem, die codierten Daten in ISO-8859-1 zu konvertieren. Zum Beispiel:

// assume any strings in $result are UTF-8 encoded 
$json = json_encode($result); 

$output = mb_convert_encoding($json, 'ISO-8859-1', 'UTF-8'); 

echo $output; 

Wenn es immer noch nicht funktioniert, bedeutet es, dass Ihre UTF-8-Strings Zeichen nicht im ISO-8859-1-Zeichensatz enthalten. Du kannst nichts dagegen tun.

Update:

Wenn wie diese Debuggen komplexer Zeichensatzkonvertierungen, können Sie file_put_contents verwenden, um Zwischenergebnisse in eine Datei zu schreiben, die Sie mit einem Hex-Editor überprüfen können. Dies wird helfen zu bestätigen, dass die Ausgabe eines bestimmten Schrittes des Prozesses korrekt ist oder nicht.