Doppelt kodierte UTF8-Zeichen entdecken
Yeti
- programmiertechnik
Hi,
ich habe zur Zeit ein Problem mit Input, der Pseudo-UTF-8 ist, also UTF-8-Zeichen in ISO-8859-1 kodiert. Mein Code erkennt dann mittels folgender Methode den String als ISO-8859-1:
[CODE lang=php]
// based on phputf8
if (strlen($string) == 0)
return true;
return (preg_match('/^.{1}/us',$string) == 1);
[/CODE]
(Diese Methode basiert darauf, dass preg_match bei Nicht-UTF-8-Kodierungen kein einziges Zeichen matcht, wenn der Modifier u gesetzt wird.)
Danach wird der ISO-8859-1-String richtigerweise in UTF-8 konvertiert. Leider kommen hin und wieder Daten daher, bei denen die Umlaute bereits UTF-8-kodiert waren, dann aber in ISO-8859-1 zurück konvertiert wurden. Dann werden diese natürlich erneut kodiert, so dass im Grunde für einen Umlaut vier Bytes verwendet werden und ein ü wird zu ü.
Wie kann ich dies verhindern? Soll ich nach dem ersten Zeichen (Ã) des UTF-8-Strings suchen und dann entsprechend umwandeln? Was ist dann mit anderen Sprachen als Deutsch? Trifft das auf die auch zu?
Der Yeti
Sorry, Code falsch kodiert. ;-)
Hier noch einmal:
// based on phputf8
if (strlen($string) == 0)
return true;
return (preg_match('/^.{1}/us',$string) == 1);
Hi,
sorry, es lag daran, dass ich vorher noch html_entity_decode ausgeführt habe, der ISO-8859-1-Output generiert hat. Eine Umstellung der Befehle und Setzen des dritten Parameters von html_entity_decode auf 'UTF-8' haben das Problem gelöst.
Der Yeti
Hi,
return (preg_match('/^.{1}/us',$string) == 1);
(Diese Methode basiert darauf, dass preg_match bei Nicht-UTF-8-Kodierungen kein einziges Zeichen matcht, wenn der Modifier u gesetzt wird.)
Kannst Du das bitte irgendwie belegen?
Ich finde zu /u nur, daß dann das Pattern als UTF-8 betrachtet wird.
cu,
Andreas