Helpmij.nl
Helpmij.nl
Helpmij.nl

Quote

Weergeven resultaten 1 tot 10 van 10

Onderwerp: Encoded string decoden

  1. #1
    Mega Senior JeroenE's avatar
    Geregistreerd
    20 maart 2005
    Locatie
    Brugge
    Vraag is opgelost

    Encoded string decoden

    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 aangepast door JeroenE : 19 oktober 2021 om 22:41
    Met beide voeten op de grond, kom je geen stap vooruit.

  2. #2
    Moderator bron's avatar
    Geregistreerd
    13 augustus 2013
    Locatie
    Nederland
    Dit vond ik, dan wordt het omgezet in html entities. Het werkt voor alle utf-8 tekens.
    PHP Code:
    1
    2
    3
    4
    
    $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
    Bestaande- en nieuwe websites op smartphone, tablet en pc.

  3. #3
    Mega Senior JeroenE's avatar
    Geregistreerd
    20 maart 2005
    Locatie
    Brugge
    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 aangepast door JeroenE : 24 oktober 2021 om 14:05
    Met beide voeten op de grond, kom je geen stap vooruit.

  4. #4
    Moderator bron's avatar
    Geregistreerd
    13 augustus 2013
    Locatie
    Nederland
    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 aangepast door bron : 27 oktober 2021 om 01:52
    Bestaande- en nieuwe websites op smartphone, tablet en pc.

  5. #5
    Mega Honourable Senior Member Aar's avatar
    Geregistreerd
    3 augustus 2014
    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 aangepast door Aar : 27 oktober 2021 om 11:20
    Was voorheen: PHP4U

  6. #6
    Mega Senior JeroenE's avatar
    Geregistreerd
    20 maart 2005
    Locatie
    Brugge
    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 aangepast door JeroenE : 27 oktober 2021 om 14:46
    Met beide voeten op de grond, kom je geen stap vooruit.

  7. #7
    Moderator bron's avatar
    Geregistreerd
    13 augustus 2013
    Locatie
    Nederland
    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 aangepast door bron : 27 oktober 2021 om 18:59
    Bestaande- en nieuwe websites op smartphone, tablet en pc.

  8. #8
    Mega Senior JeroenE's avatar
    Geregistreerd
    20 maart 2005
    Locatie
    Brugge
    Quote Origineel gepost door bron Bekijk Bericht
    Het aantal "nullen" kon ik in de voorbeeld $tekst niet overzien, als dit voorkomt is ltrim($arr[$i], "0") een goede oplossing.
    Dankjewel

    Quote Origineel gepost door bron Bekijk Bericht
    Dan worden blijkbaar alleen 1-byte en 2-bytes karakters van utf-8 aangeleverd.
    Klopt, er worden inderdaad alleen utf-8 karakters gegeven.
    Met beide voeten op de grond, kom je geen stap vooruit.

  9. #9
    Moderator bron's avatar
    Geregistreerd
    13 augustus 2013
    Locatie
    Nederland
    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.
    Bestaande- en nieuwe websites op smartphone, tablet en pc.

  10. #10
    Mega Senior JeroenE's avatar
    Geregistreerd
    20 maart 2005
    Locatie
    Brugge
    Aziatisch tekens uit de utf-8 set zal niet gaan lukken.
    Dankjewel voor de tip. Nieuw punt op de to-do list
    Met beide voeten op de grond, kom je geen stap vooruit.

Berichtenregels

  • U mag geen nieuwe vragen starten.
  • U mag niet reageren op berichten.
  • U mag geen bijlagen versturen.
  • U mag uw berichten niet bewerken.
  •  
Helpmij.nl
Helpmij.nl

Helpmij.nl

Regels
Help

Helpmij.nl en business

Partners
Sponsoren