Yeti: Doppelt kodierte UTF8-Zeichen entdecken

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

  1. Sorry, Code falsch kodiert. ;-)
    Hier noch einmal:

      
    // based on phputf8  
    if (strlen($string) == 0)  
        return true;  
    return (preg_match('/^.{1}/us',$string) == 1);  
    
    
  2. 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

  3. 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

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.