Hat mein Code nicht Zeilenumbrüche hinzugefügt?

Kannst du das in deinem Post bitte mal irgendwie fixen?
Jedenfalls: Die Eingabedaten scheinen völlig korrekt in UTF-8 kodiert zu sein.
Es wurden lediglich teilweise falsche Zeichen kodiert. Das ist sicherlich ein vorangehender Konvertierungsfehler.
Das einzige Problem mit den geposteten Beispieldaten ist das Zeichen, welches eigentlich das €-Zeichen sein sollte. Das ist kodiert als xC280. xC280 steht in der Unicode-Tabelle direkt hinter ASCII und bezeichnet einen „<control>“-Character.
-
Unicode/UTF-8-Zeichentabelle
Wenn man sich etwas mit Zeichensätzen auskennt, kann man sich jetzt in etwa denken, was passiert ist:
Es gab eine ursprüngliche Eingabe in ISO-8859-1, die nach UTF-8 kodiert wurde. x80 ist in ISO-8859-1 aber ein Kontrollzeichen, nicht das €-Symbol, und wurde deshalb völlig korrekt zu diesem ominösen xC280.
Nur war diese Eingabe eigentlich kein ISO-8859-1, sondern Windows-1252. Dort steht x80 für das €-Zeichen.
-
ISO 8859-1 ? Wikipedia
In Code:
PHP-Code:
<?php // Datei-Kodierung: UTF-8
header('Content-Type: text/html; charset=UTF-8');
// String in Windows-1252 erzeugen
$cp1252 = mb_convert_encoding('Kaufpreis: € 150,00 / m²', 'Windows-1252', 'UTF-8');
// Diesen String fälschlich als ISO-8859-1 interpretieren und nach UTF-8 umwandeln
echo mb_convert_encoding($cp1252, 'UTF-8', 'ISO-8859-1');
Gibt's einen Fix? – Eigentlich nein. Aber da du wohl davon ausgehen kannst, dass niemand Steuerzeichen in seinen Text setzt, kannst du bei den entsprechenden Zeichen annehmen, dass sie falsch konvertiert wurden.
Das betrifft alle Zeichen, die in Windows-1252 dort liegen, wo in ISO-8859-1 die Steuerzeichen liegen. In UTF-8 gesprochen: Alles zwischen xC280 und xC29F. Die müssen in die korrekten UTF-8-Entsprechungen konvertiert werden.
Um es kurz zu machen:
PHP-Code:
function cp1252Fixes($input)
{
$fixes = array(
"\xC2\x80" => "\xE2\x82\xAC",
"\xC2\x81" => "\xEF\xBF\xBE",
"\xC2\x82" => "\xE2\x80\x9A",
"\xC2\x83" => "\xC6\x92",
"\xC2\x84" => "\xE2\x80\x9E",
"\xC2\x85" => "\xE2\x80\xA6",
"\xC2\x86" => "\xE2\x80\xA0",
"\xC2\x87" => "\xE2\x80\xA1",
"\xC2\x88" => "\xCB\x86",
"\xC2\x89" => "\xE2\x80\xB0",
"\xC2\x8A" => "\xC5\xA0",
"\xC2\x8B" => "\xE2\x80\xB9",
"\xC2\x8C" => "\xC5\x92",
"\xC2\x8D" => "\xEF\xBF\xBE",
"\xC2\x8E" => "\xC5\xBD",
"\xC2\x8F" => "\xEF\xBF\xBE",
"\xC2\x90" => "\xEF\xBF\xBE",
"\xC2\x91" => "\xE2\x80\x98",
"\xC2\x92" => "\xE2\x80\x99",
"\xC2\x93" => "\xE2\x80\x9C",
"\xC2\x94" => "\xE2\x80\x9D",
"\xC2\x95" => "\xE2\x80\xA2",
"\xC2\x96" => "\xE2\x80\x93",
"\xC2\x97" => "\xE2\x80\x94",
"\xC2\x98" => "\xCB\x9C",
"\xC2\x99" => "\xE2\x84\xA2",
"\xC2\x9A" => "\xC5\xA1",
"\xC2\x9B" => "\xE2\x80\xBA",
"\xC2\x9C" => "\xC5\x93",
"\xC2\x9D" => "\xEF\xBF\xBE",
"\xC2\x9E" => "\xC5\xBE",
"\xC2\x9F" => "\xC5\xB8"
);
return str_replace(array_keys($fixes), array_values($fixes), $input);
}
header('Content-Type: text/plain; charset=UTF-8');
$input = cp1252Fixes($input);
echo $input;
Rant am Rande:
Warum passieren solche Fehler? Auch deshalb, weil Browser sowas…
PHP-Code:
<?php // UTF-8
header('Content-Type: text/html; charset=ISO-8859-1');
echo mb_convert_encoding('Dies ist „ein“ Test €.', 'Windows-1252', 'UTF-8');
…„korrekt“ (also lesbar) rendern. Das ist falsch falsch falsch. (Auch wenn die offiziellen Stellen vielleicht etwas anderes behaupten.

)