Rolf B: Zeichensatzproblem mit mysqli_fetch_all

Beitrag lesen

Hallo Nico,

Sobald ich die CSV-Daten ohne utf8-encode() im Array_2 speichere, werden in var_dump(Array_1) die Umlaute falsch dargestellt, mit utf8-encode() erscheinen sie korrekt.

Das ist wirklich verrückt. Hier spielen weitere Effekte mit, die Du vermutlich für irrelevant hältst, die aber dennoch Einfluss haben.

Abfrage DB-Daten => Speicherung in Array_1 (Umlaute korrekt)
Einlesen CSV-Daten => Speicherung in Array_2 (Umlaute korrekt)
Quervergleich zwischen DB-Daten und CSV-Daten (Umlaute in Array_1 fehlerhaft)

Nein, das KANN nicht sein. Dass sie Daten in Array_1 durch einen Vergleich mittels similar_text verändert werden, schließe ich aus. Da passiert noch irgendwas anderes. Ich kann nicht beurteilen, ob deine Vorstellung von "korrekt" der Realität entspricht

Ich habe ein Testprogramm geschrieben:

<pre><?php
$utfmuell = "Müller";
$ansimuell = utf8_decode($utfmuell);

echo strlen($utfmuell) . " - " . bin2hex($utfmuell) . "\n";
echo strlen($ansimuell) . " - " . bin2hex($ansimuell) . "\n";

$db = [ "name" => $utfmuell ];
$csv = [ "name" => $ansimuell ];

var_dump($db);
var_dump($csv);

echo "Ähnlichkeit: " . similar_text($db['name'],  $csv['name']);

var_dump($db);
var_dump($csv);

Die Codierung des PHP-Quellcodes ist UTF-8, deshalb erhalte ich mit utf8_decode($utfmuell) die ANSI-Version. Wenn man es genau nimmt, verwende ich hier eine missbilligte Funktion, utf8_decode verwendet ISO-8859-1 als Zeichensatz, der obsolet ist und durch ISO-8859-15 ersetzt wurde. Die Unterschiede sind aber marginal, und für mein Testprogramm liefern utf8_decode und iconv("UTF-8", "ISO-8859-15", $utfmuell) das gleiche.

Wenn ich das laufen lasse, erhalte ich:

Warning: Your output contains characters that could not be displayed.

7 - 4dc3bc6c6c6572
6 - 4dfc6c6c6572

array(1) {
  ["name"]=>
  string(7) "Müller"
}
array(1) {
  ["name"]=>
  string(6) "Mller"
}

Ähnlichkeit: 5

array(1) {
  ["name"]=>
  string(7) "Müller"
}
array(1) {
  ["name"]=>
  string(6) "Mller"
}

Die ANSI-ü erzeugen die Warnung, dass ungültige Zeichen in der Ausgabe wären, darum steht da Mller für die ANSI-Ausgaben. Dort, wo Müller in der Ausgabe steht, war ein UTF-8 String.

Also - da ändert sich nichts. Nicht in der Minimalversion.

Rolf

--
sumpsi - posui - obstruxi