Ankündigung

Einklappen
Keine Ankündigung bisher.

Gibt es String Funktionen, die das (vermeintliche) Encoding ignorieren bzw. ASCII erzwingen?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Gibt es String Funktionen, die das (vermeintliche) Encoding ignorieren bzw. ASCII erzwingen?

    Hallo Profis,
    ich habe in einer Datenbank ein paar Angaben, die unter Windows mit VBA recht simpel verschlüsselt wurden.
    Wenn ich nun die Entschlüsselung nach php umsetze, dann schießen mir leider die Stringfunktionen dazwischen, da sie scheinbar glauben, der String hätte sonstwas für ein Format und geben dann Unsinn aus.
    Als Beispiel der verschlüsselte String "¦ÞµºÎ× hg", unter VBA kommt bei der Entschlüsselung folgendes heraus:

    ¦ÞµºÎ× hg

    9

    1:¦:166
    2:Þ:222
    3:µ:181
    4:º:186
    5:Î:206
    6:×:215
    7: :160
    8:h:104
    9:g:103

    Das sind der Reihe nach der zu entschlüsselnde String, die länge dieses Strings und dann je Zeichen "Index" : "Char Zeichen" : "Ascii Code".

    unter php bekomme ich

    "¦ÞµºÎ× hg"

    16

    b"""
    \n
    1:¦:166\n
    2:Ã:195\n
    3:ž:158\n
    4:Â:194\n
    5:µ:181\n
    6:Â:194\n
    7:º:186\n
    8:Ã:195\n
    9:Ž:142\n
    10:Ã:195\n
    11:—:151\n
    12:Â:194\n
    13: :160\n
    14:h:104\n
    15:g:103\n
    16::0\n
    """

    ""

    Erstens verstehe ich nicht, woher die Zeile b""" kommt aber vor allem ist schon die Länge 16 falsch, richtig wäre wie oben 9. Danach sind ab dem zweiten Zeichen nicht nur alle Ascii Codes falsch, sondern bereits die einzelnen Zeichen, die angezeigt werden. Nur das erste ist richtig. Die Eingabezeichenfolge "¦ÞµºÎ× hg", aus der die Zeichen extrahiert werden wird aber wiederum korrekt angezeigt.Ich habe teilweise schon versucht die Behandlung als ASCII Code zu erzwingen aber erfolglos.

    Hier der Code, der die o.a. Ausgabe erzeugt:
    Code:
    $lenEnc = mb_strlen($strToDecode, 'ASCII');
    //for($i=1; $i <= $lenEnc; $i++) {
    //  $strResult .= chr(GetOfIndex(ord(right($strToDecode,$lenEnc - $i +1)), VirtPos($i, $lenPw, $cfc)));
    //}  
    
     $r = "";
     $vp = 0;
     $asci = 0;
     $gofi = 0;
     $char = "";
     $rTest = "\n";
     for($i=1; $i <= $lenEnc; $i++) {
      $r = mb_substr($strToDecode, $i, 1, "ASCII");  
      $vp = VirtPos($i,  $lenPw, $cfc);
      $asci = ord($r);
      $rTest .= $i . ":" . $r . ":" . $asci . "\n";
     }
    dd($strToDecode, $lenEnc, $rTest, $strResult);
    Ich bin für jeden Tipp dankbar, wie ich das ganze umstellen muss, um das gleiche Resultat, wie ganz oben zu bekommen

    lg.
    K.

  • #2
    Du kannst Strings mit [man]iconv[/man] von einem Zeichensatz in einen anderen konvertieren. Mit [man]mb_detect_encoding[/man] kannst du außerdem sehen welchen Zeichensatz PHP erkennt. Genaueres kann ich nicht sagen, weil mir unklar ist, ob das tatsächlich ein String sein sollte und nicht einfach nur Binärdaten, was die Funktionen machen die du hier ausgelassen hast, und wie die Variable überhaupt zu ihrem Inhalt kommt (über Datei eingelesen oder hardcoded)?

    Kommentar


    • #3
      Hi,
      die ausgelassenen Zeilen spielen an der Stelle noch keine Rolle. Der String kommt später aus einer Datenbank. Im Moment ist er Hardcoded, um die Geschichte besser Untersuchen zu können, so hat man den Vergleich mit der korrekten Umrechnung oben.

      Mit detetct encoding und iconv habe ich schon experimentiert, hat leider nicht funktioniert. Wie gesagt eigentlich soll PHP gar nicht über die Kodierung "nachdenken"

      Kommentar


      • #4
        Zitat von K.G. Beitrag anzeigen
        Mit detetct encoding und iconv habe ich schon experimentiert, hat leider nicht funktioniert. Wie gesagt eigentlich soll PHP gar nicht über die Kodierung "nachdenken"
        Text muss eine Kodierung haben, ansonsten sind es halt Binärdaten. ASCII sind 7 Bit und beinahe mit fast jedem (relevanten) Zeichensatz kompatibel, sodass das hier keine Rolle spielt. Du siehst ja auch, dass es bei "h" und "g" keine Probleme gibt. Alle anderen Zeichen brauchen in deinem Zeichensatz offenbar nur 1 Byte, in dem den PHP erkennt aber > 1 Byte, daher passt auch die Länge nicht. Hier mal auf meinem Rechner vorgezeigt:

        PHP-Code:
        php $str "¦ÞµºÎ× hg";
        php > echo strlen($str);
        15
        php 
        > echo mb_detect_encoding($str);
        UTF-8
        php 
        $str_conv iconv("UTF-8""ISO-8859-1"$str);
        php > echo strlen($str_conv);

        Das hätte z.B. die Länge 9, aber ob "ISO-8859-1" der richtige Zeichensatz ist kannst nur du wissen. PHP kann das nicht ignorieren, weil es relevant ist.

        Kommentar


        • #5
          Mache mal einen SQL Dump deiner DB und stell den Code hier rein.
          Mit PHP MyAdmin auf Export klicken dann custom auswählen und bei View, output as text wählen. Ergebnis kopieren und hier einfügen.

          Kommentar


          • #6
            Wofür einen Dump der DB, wenn es schon mit dem Hartkodierten String nicht geht? Das wäre mal die erste Voraussetzung

            Mit $str_conv = iconv("UTF-8", "ISO-8859-1", $str); hatte ich auch schon experimentiert aber wohl die falschen Parameter erwischt. Damit geht es jetzt. Ob "ISO-8859-1" wirklich für alle Fälle richtig ist muss ich noch testen aber welche Kodierung Excel auf Windows nutzt dürfte sich rausfinden lassen.

            Danke.

            Kommentar


            • #7
              Weil man dann die Zeichenkodierung der DB und Spalten sieht.
              Du musst von Excel, also Windows-1252 zu utf8 codieren, erst dann in der DB speichern.

              Danach musst du nicht mehr umwandeln,da die Daten korrekt in der DB stehen.

              Voraussetzung ist, dass du alles auf utf8 stehen hast und die DB Verbindung auch utf8 hat. Die PHP-Scripte müssen auch als utf8 gespeichert sein.

              Machst du das nicht hast immer Zeichensalat oder gar Informationsverlust.

              Kommentar


              • #8
                Verdammt, mit anderen Strings klappt es immer noch nicht. Nun bekomme ich "illegal Character" von iconv.

                Was ich einfach nicht verstehe: php Zeigt mir anfangs den richtigen String an, erst wenn ich die länge oder einzelne Zeichen abfrage kommt unsinn heraus.

                Code:
                "¦èòÈÙ¦«£ŸæÀ³âÔ¢ÆÝu¼»¹ž¬º*à"
                
                53
                
                b"""
                \n
                1:┬:194\n
                2:ª:166\n
                3:├:195\n
                4:¿:168\n
                5:├:195\n
                6:â:131\n
                Ich habe extra nicht alle Zeichen gepostet aber dieses mal stimmt es ja schon von Anfang an nicht. Das wirklich komische: Der Anfangs ausgegebene String ist korrekt. Kopiere ich den in mein VBA Tool dann wird er korrekt entschlüsselt :/

                Kommentar


                • #9
                  Beitrag#7 überlesen?

                  Kommentar


                  • #10
                    Auch wenn ich mich wiederhole: Warum behandelst du das auch als Text? Speicher das als Bytestream ab und wenn du Nachrichtenaustausch benötigst, dann konvertier die Bytes in Hex-Darstellung.
                    Vergleiche folgendes Beispiel:
                    PHP-Code:
                    php $a md5("a"true);
                    php > echo $a;

                    �u���1�iw&a
                    php 
                    > echo strlen($a);
                    16
                    php 
                    $str "�u���1Ù�iw&a";
                    php > echo strlen($str);
                    23 
                    md5() mit dem zweiten Parameter (raw_output) auf true, liefert ebenfalls Binärdaten. Wenn man das als Text interpretiert ergeben sich eben solche Probleme.

                    Kommentar


                    • #11
                      Sorry, Nachricht 7 wurde mir eben noch nicht angezeigt, obwohl ich vor dem post aktualisiert hatte. Hat sich vermutlich knapp überschnitten.
                      Das Problem dabei ist, das ganze System ist schon über zwei Jahre in Benutzung und die Daten werden von mehreren Excel Tools ständig genutzt. Daran, wie die Daten in der DB stehen kann ich also nichts mehr ändern.
                      Ich muss die Daten also so nehmen, wie sie aus der DB kommen.
                      "¦èòÈÙ¦«£ŸæÀ³âÔ¢ÆÝu¼»¹ž¬º*à" von oben ist da ein valides Beispiel, Excel VBA schert sich da nicht um irgeneine mögliche Kodierung, sondern gibt mir die Zeichen so der Reihe nach, wie sie auch vprher alsString angezeigt wurden. Gibt es in php vielleicht so etwas wie Array of Char? Explode reicht dafür leider auch nicht, wenn ich das auf "¦èòÈÙ¦«£ŸæÀ³âÔ¢ÆÝu¼»¹ž¬º*à" anwende bekomme ich auch nicht der Reihe nach die Zeichen, wie sie da stehen :/ lg

                      Kommentar


                      • #12
                        Beitrag 7 hat mich noch mal ein gutes Stück weiter gebracht, mit $strToDecode = iconv("UTF-8", "WINDOWS-1252", $strToDecode); Wird nun auch dieser String richtig entschlüsselt.
                        Bei irgendeinem anderen kommt dann jetzt aber wieder iconv(): Detected an illegal character in input string
                        Da muss ich dann jetzt wohl erst mal meine php Kentnisse ausbauen, um überhaupt die richtige Stelle zu finden

                        Kommentar


                        • #13
                          Also $strToDecode = iconv("UTF-8", "WINDOWS-1252", $strToDecode); funktioniert jetzt für gut 2/3 der Einträge. Diese werden also komplett richtig entschlüsselt und ausgegeben.

                          Bei dem restlichen drittel bekomme ich aber z.B.: iconv(): Detected an illegal character in input string, bei ¬ÛÆ¿ÄÚ¦½¢˜žn—åÖ¬Ì߯ÊÉg[†º¤ÞÛèå«ÆÜ¢§®¾¢Ç¡ËÖѨ

                          Lasse ich mir vorher per mb_detect_encoding($strToDecode, 'auto'); die derzeitige Kodierung ausgeben, so gibt er mir UTF-8 aus und zwar bei denen, die entschlüsselt werden können und bei denen es nicht geht auch. In der MySql Datenbank ist aber eigentlich latin 1 - latin1_german1_ci eingestellt. Die DB kann ich wie gesagt auch leider nicht mehr ändern.

                          Noch jemand eine Idee, wie ich das letzte drittel noch durch die Prozedur bekomme?

                          Kommentar


                          • #14
                            Mit
                            Code:
                             ALTER TABLE tableName CHARACTER SET utf8;
                            kannst du die DB-Tabelle ändern, warum nicht?
                            Das muss auf alle Tabellen angewandt werden, die du hast,, falls es mehr als eine ist.

                            DB und utf8
                            Zeichenwirrarr Wissensammlung

                            Kommentar


                            • #15
                              Strings in PHP sind Binärdaten und haben selbst keine Codierung. Die Probleme entstehen auch nicht durch Stringfunktionen sondern erst bei der Ausgabe als Text. Wenn du Binärdaten erzeugst macht es keinen Sinn für diese eine passende Codierung zu suchen. Irgendwas passt immer nicht. Um die Daten sichtbar zu machen kannst du diese nur byteweise hexadezimal ausgeben.

                              Kommentar

                              Lädt...
                              X