2010-07-22 3 views
6

Dies ist codiert: \u00d6
Dieser dekodiert wird: ÖWie codierst du Strings wie u00d6?

Welche Funktion, die ich verwendet, um lesbar diese Zeichenfolge in etwas zu entschlüsseln?

\u00d6asdf -> Öasdf 

Antwort

2

wäre normalerweise diese die urldecode Methode, aber es Unicode-Zeichen gilt nicht, wie bei Ihnen. Versuchen Sie dieses stattdessen:

function unicode_urldecode($url) 
{ 
    preg_match_all('/%u([[:alnum:]]{4})/', $url, $a); 

    foreach ($a[1] as $uniord) 
    { 
     $utf = '&#x' . $uniord . ';'; 
     $url = str_replace('%u'.$uniord, $utf, $url); 
    } 

    return urldecode($url); 
} 
+3

Hier sind einige Dinge falsch ... Sie ersetzen% uXXXX anstelle von \ uXXXX, ersetzen die Sequenzen durch Entitäten (was für die Darstellung der Zeichenfolge gut wäre, außer jetzt müssen Sie htmlspecialchars sagen, die Zeichenfolge nicht doppelt zu codieren und natürlich, jetzt unterscheiden Sie nicht html-Entitäten, die ursprünglich in der Zeichenfolge für die generierten enthalten sind); schließlich rufst du urldecode auf, was nichts mit der Frage zu tun hat - url encoding codiert bytes (max Wert ist% FF) und entschlüsselt die HTML-Entities, die du gerade erstellt hast, nicht. – Artefacto

6

Zur Umrechnung in UTF-8, tun:

preg_replace('/\\\\u([0-9a-f]{4})/ie', 
    'mb_convert_encoding("&#x$1;", "UTF-8", "HTML-ENTITIES")', 
    $string); 

Da dies die in JSON verwendet, Flüchten, wäre eine weitere Option json_decode sein. Dies würde jedoch auch das Entfernen von doppelten Anführungszeichen und umgekehrten Schrägstrichen voraussetzen (außer denen der \uXXXX Escape-Sequenzen) und doppelte Anführungszeichen um die Zeichenfolge hinzufügen. Wenn jedoch die Zeichenfolge tatsächlich JSON-codiert ist und das ursprünglich die Frage motiviert hat, wäre die richtige Antwort natürlich json_decode anstelle der obigen Methode.