Encoded string decoden

Status
Niet open voor verdere reacties.

JeroenE

Terugkerende gebruiker
Lid geworden
20 mrt 2005
Berichten
1.950
Hi,

Hoe kan ik in php tekenreeksen als de volgende decoderen naar leesbare tekst: \u00c4\u0087\u00c3\u00a8\u00c3\u00a9\u00c3\u00a9r\u00c3\u00ab

Met mb_convert_encoding($sstr, "UTF-8", "....") lijkt het niet te werken. (met $sstr = "\u00c4\u0087\u00c3\u00a8\u00c3\u00a9\u00c3\u00a9r\u00c3\u00ab")

Alvast bedankt om mee te denken.

Jeroen
 
Laatst bewerkt:
Dit vond ik, dan wordt het omgezet in html entities. Het werkt voor alle utf-8 tekens.
PHP:
$tekst = "\u00c4\u0087\u00c3\u00a8\u00c3\u00a9\u00c3\u00a9r\u00c3\u00ab";
$tekst = str_replace('\u', 'u', $tekst);
$tekst = preg_replace('/u([\da-fA-F]{4})/', '&#x\1;', $tekst);
echo $tekst;

Jouw voorbeeld tekst wordt dan in de browser goed weergegeven. Het ziet er zo uit.
ćèéérë

btw. u00a9r is niet toegestaan als utf-8 teken
 
Dankjewel, bron, voor de eenvoudige convertie, maar zo is het nog niet echt leesbare tekst.

btw. dit heb ik niet vermeld, maar $tekst zijn namen zoals Ivanović (Ivanovi\u00c4\u0087) en Jérémie (J\u00c3\u00a9r\u00c3\u00a9mie). Vandaar de u00a9r
de lijst komt van het uitgevoerde json-bestand van de facebook vriendenlijst, en die komen dus met de \u... codes in het json-bestand te staan
Met json_decode() in php krijg ik voor Jérémie dit: Jérémie
 
Laatst bewerkt:
Dit werkt denk ik aardig. Ik heb het niet in verschillende situaties getest
Code:
$tekst  = "Ivanovi\u00c4\u0087\u0020J\u00c3\u00a9r\u00c3\u00a9mie";

$result = "";
$arr    = explode("\u", $tekst);
$arrLen = count($arr);
for ($i = 0; $i < $arrLen; $i++) {
    if ($i == 0 && (substr($tekst, 0, 2) != "\u")) {
        // $tekst begint niet met \u dus $arr[0] zijn gewone letters
        $result .= $arr[0];
    } else {
        // converteer 3e/4e teken naar leesbaar teken (ervan uitgaand dat 1e/2e teken altijd 00 is)
        $byte = substr($arr[$i], 2, 2);
        $result .= pack('H*', $byte);
        // als er meer dan 4 tekens zijn, plak vanaf 5e teken eraan vast
        if (strlen($arr[$i]) > 4) {
            $result .= substr($arr[$i], 4);
        }
    }
}

echo $result;  //  Ivanović Jérémie

Omdat utf-8 tekens een variabele lengte hebben (1, 2, 3 of 4 bytes) weet ik niet zeker of dit altijd werkt.
 
Laatst bewerkt:
Het is best een complexe vraag. Misschien weten ze het op Tweakers?

Ik denk zelf eerder dat je met een aantal speciale functies die je op een juiste manier combineert dit ook wel kunt oplossen.
 
Laatst bewerkt:
Dankjewel bron en Aar voor de ideeën en mogelijke oplossing.

Ik heb de oplossing van bron als volgt aangepast om het werkende te krijgen:

Code:
$tekst  = "Ivanovi\u00c4\u0087\u0020J\u00c3\u00a9r\u00c3\u00a9mie";

$result = "";
$arr    = explode("\u", $tekst);
$arrLen = count($arr);
for ($i = 0; $i < $arrLen; $i++) {
    if ($i == 0 && (substr($tekst, 0, 2) != "\u")) {
        // $tekst begint niet met \u dus $arr[0] zijn gewone letters
        $result .= $arr[0];
    } else {
        // verwijder alle voorloop nullen
        $byte = ltrim($arr[$i], "0");
        // converteer 1e/2e teken naar leesbaar teken
        $byte = substr($byte, 0, 2);
        $result .= pack('H*', $byte);
        // als er meer dan 4 tekens zijn, plak vanaf 5e teken eraan vast
        if (strlen($arr[$i]) > 4) {
            $result .= substr($arr[$i], 4);
        }
    }
}

echo $result;  //  Ivanović Jérémie

Dit werkt perfect voor eender welk teken.

Dankjewel voor de hulp
 
Laatst bewerkt:
Het aantal "nullen" kon ik in de voorbeeld $tekst niet overzien, als dit voorkomt is ltrim($arr[$i], "0") een goede oplossing.

De pack functie heb ik van SO gehaald, dit is voor mij echt te bijzonder ;)
Code:
$result .= pack('H*', $byte);

Dit werkt perfect voor eender welk teken.
Dan worden blijkbaar alleen 1-byte en 2-bytes karakters van utf-8 aangeleverd.
 
Laatst bewerkt:
Klopt, er worden inderdaad alleen utf-8 karakters gegeven.
De utf-8 karakters zijn dynamisch in lengte, ze zijn 1, 2, 3 of 4 bytes groot. De syntax \uAABB kan alleen utf-8 karakters weergeven die maximaal 2 bytes groot zijn. Op zich geen probleem want daarmee kan je alle West-Europese tekens en symbolen weergeven. Aziatisch tekens uit de utf-8 set zal niet gaan lukken.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan