2017-12-26 16 views
1

mir dies mit:Decode Unicode charmap (höchstwahrscheinlich nicht-Standard) mit PHP

\u00c3\u0083\u00c2\u00b6 

Das steht für das Deutsch ö Charakter (ö in html).

Mein Problem ist, dass ich nicht weiß, in welcher Kodierung es ist, versuchte ich mehrere Entschlüsselungsmethoden (einschließlich json_decode und mb_convert_encode('\u00c3\u0083\u00c2\u00b6','HTML-ENTITIES','UTF-8');), um zu ö Zeichen zu gelangen, aber kein einziges funktionierte.

Ich kann nicht nachschlagen, wie dies an erster Stelle codiert wurde, aufgrund der Tatsache, dass dies von einem Datenbankabbild stammt, für das der Quellcode nicht verfügbar ist.

Diese Frage ist nicht ein Duplikat How to decode Unicode escape sequences like "\u00ed" to proper UTF-8 encoded characters?

aufgrund der Tatsache, dass die charmap keine gültigen UTF-8 oder UTF-16 zu sein scheinen und mit einem der daher nicht decodiert werden kann, Methoden in der verknüpften Frage.

+3

Das ist einige ernsthafte Mojibake los dort. So etwas wie UTF-8, interpretiert als Latin-1, codiert in Unicode-Escapes oder etwas in dieser Richtung. Definitiv etwas, das du an der Quelle reparieren solltest, wenn es dafür nicht zu spät ist. – deceze

+0

Ich brauche nur diesen Speicherauszug, ich muss ihn nicht erneut importieren oder etwas anderes, was mich dazu zwingen würde, den Code zu reparieren (den ich aus dem gleichen Grund nicht habe). Gibt es irgendeine Möglichkeit, dieses Chaos irgendwie zu entschlüsseln? Ideal mit PHP. Vielen Dank! – Michael

+0

Probieren Sie zunächst einige Kodierungseinstellungen für die Tabelle aus, in der Daten gespeichert sind. 'ALTER TABLE [Tabelle] CONVERT TO CHARACTER SET [uft8_general_ci, ucs2_general_ci, etc.];' Siehe: https://dev.mysql.com/doc /refman/5.5/en/charset-charsets.html. Wenn Ihre Tabellenzeichencodierung nicht mit der Codierung übereinstimmt, als die Daten gespeichert wurden, erhalten Sie alle möglichen Probleme wie diese. Auf die eine oder andere Art müssen Sie die ursprüngliche Codierung identifizieren. –

Antwort

1

So als Referenz, die Quelldaten war UTF8, und dann lief jemand etwas Gleichwertiges zu utf8_encode() [die ISO8859-1 zu UTF8 übersetzt, ohne Rücksicht auf das, was die Eingabe tatsächlich ist] auf sie zweimal.

function unescape_unicode($input) { 
    return preg_replace_callback(
     '/\\\\u([0-9a-fA-F]{4})/', 
     function ($match) { 
      return mb_convert_encoding(
       pack('H*', $match[1]), 
       'UTF-8', 
       'UTF-16BE' 
      ); 
     }, 
     $input 
    ); 

} 

$input = "\u00c3\u0083\u00c2\u00b6"; 

var_dump(
    bin2hex(
     utf8_decode(// un-mojibake #1 
      utf8_decode(// un-mojibake #2 
       unescape_unicode($input) 
      ) 
     ) 
    ) 
); 

Ausgang:

string(4) "c3b6" 

Wo 0xc3 0xb6 ist die UTF8 Darstellung ö.

Do NICHT Setzen Sie diesen Code in Produktion. Sie sollten es nur verwenden, um Daten zu entschlacken, die nicht anderweitig richtig aus dem zugrunde liegenden Speicher wiederhergestellt oder abgerufen werden können. Die primäre Absicht des obigen Codes ist es, zu illustrieren, wie es gebrochen ist.

Dies ist Ihre neue Bibel: UTF-8 all the way through