dedlfix: Zeichenkodierung finden

Tach!

Ich hab da mal ein Problem. Ich suche die Zeichenkodierung, die die deutschen Umlaute wie bei Codepage 850 platziert hat, also z.B. ä hat 0x84. Die Bytes unterhalb 0x80 entsprechen ASCII. Aber andere Zeichen bekomme ich grad nicht ordentlich dekodiert, wenn ich CP850 zugrunde lege. 0xB3 ist ein öffnendes Anführungszeichen, 0xCA ein schließendes. Soweit kann man das aus dem Kontext erraten. 0xCC könnte ein Zeichen sein, dass für einen Aufzählungspunkt verwendet wird. Mehr Zeichen hab ich grad nicht auf Lager, da muss ich erstmal den Datenbestand nach allen Vorkommen von Bytes oberhalb 0x80 durchsuchen lassen. Welche Kodierung könnte das sein? ISO-8859-1 und Windows-1252 sind es jedenfalls nicht. Hilfreich wäre auch ein Tool, das nach Eingabe eines Hex/Dez-Wertes die Zeichen auflistet, die es in den verschiedenen Kodierungen sind. Also ähnlich zur ISO-8859-Tabelle in der Wikipedia, nur nicht auf ISO-8859 beschränkt. Meine Recherche nach einem solchen Tool ergab mit meinen Suchwörtern leider nichts derartiges.

dedlfix.

  1. Hallo und guten Abend,

    aus welcher Zeit und Welt stammen denn die Daten?

    sonst siehe Wikipedia

    Grüße
    TS

    --
    es wachse der Freifunk
    http://freifunk-oberharz.de
    1. Tach!

      aus welcher Zeit und Welt stammen denn die Daten?

      Es ist ein aktuelles System aus der Windows-Welt. Das Alter sagt aber nicht viel aus, denn aus Kompatibilitätsgründen kann ein solches System ja auch mit alten Kodierungen arbeiten. Eine Kodierung aus der Lochkartenzeit ist es jedenfalls nicht.

      sonst siehe Wikipedia

      Als Tabelle alle nebeneinander zum Vergleichen wäre schön ...

      dedlfix.

    2. Tach!

      sonst siehe Wikipedia

      Die dort gelisteten DOS-Kodierungen passen entweder gar nicht zu den Umlauten oder sie haben an den drei anderen genannte Stellen Rahmenzeichen.

      Es kann auch sein, dass das gar keine offizielle Kodierung ist, sondern irgendein Mischmasch entstanden ist. Vielleicht gibt es ja auch eine andere Erklärung, wie die Anführungszeichen zu diesen beiden Bytewerten gekommen sind.

      dedlfix.

      1. Hallo und guten Abend,

        EBCDIC kann es deiner Beschreibung nach auch nicht sein.
        TRANSLATION

        Und Du bist sicher, dass es Einbyte-Code ist?

        Grüße
        TS

        --
        es wachse der Freifunk
        http://freifunk-oberharz.de
        1. Tach!

          Und Du bist sicher, dass es Einbyte-Code ist?

          Wenn die Umlaute an den dem Kontext nach korrekten Stellen sitzen und gemäß CP850 kodiert sind, wird es wohl so eine sein. Die anderen Zeichen treten bislang auch nur als Einzelbytes und nicht im Rudel auf. (Die genaue Recherche, welche Bytes insgesamt vorkommen, steht für morgen auf dem Plan.)

          dedlfix.

  2. Hilfreich wäre auch ein Tool, das nach Eingabe eines Hex/Dez-Wertes die Zeichen auflistet, die es in den verschiedenen Kodierungen sind.

    Da sollte sich mit iconv was machen lassen. iconv -l schmeisst eine lange Liste der bekannten Kodierungen, die müsste man nur durchackern.

    1. Tach!

      Hilfreich wäre auch ein Tool, das nach Eingabe eines Hex/Dez-Wertes die Zeichen auflistet, die es in den verschiedenen Kodierungen sind.

      Da sollte sich mit iconv was machen lassen. iconv -l schmeisst eine lange Liste der bekannten Kodierungen, die müsste man nur durchackern.

      Du meinst, so nach diesem Prinzip?

      <?php
      $char = "\xCA";
      
      $list = trim(`iconv -l`, "/\n"); // w/o last delimiter
      $list = explode("//\n", $list);
      ?>
      <table>
      <?php foreach ($list as $encoding): ?>
      <tr>
      <td><?= htmlspecialchars($encoding) ?></td>
      <td><?= htmlspecialchars(@iconv($encoding, 'UTF8', $char)); // suppress conversation error messages ?></td>
      </tr>
      <?php endforeach ?>
      </table>
      

      Hat schon mal für das eine Anführungszeichen nicht zum Erfolg geführt. Das liegt aber wohl eher daran, dass das anscheinend keine der bekannten Kodierungen ist.

      dedlfix.

  3. @@dedlfix

    Ich hab da mal ein Problem. Ich suche die Zeichenkodierung …

    Wozu musst du die finden? Anstatt ewig auf der Suche zu sein, bist du vielleicht besser daran, wenn du:

    1. den Text als Windows-1252-codiert (oder auch Codepage-850-codiert) betrachtest,

    2. alle Nicht-ASCII-Zeichen und Umlaute maskierst: s/[^ -~ÄÖÜäöü]/➡️$1⬅️/

      Du kannst natürlich auch andere Begrenzer wie <mark class="⚠️">$1</mark> verwenden; Hauptsache, die Zeichen(ketten) kommen im Text nicht vor.

    3. die so markierten Zeichen einzeln durchgehst und schaust, wodurch du die jeweils ersetzen musst, bspw. s/➡️³⬅️/„/

    LLAP 🖖

    --
    “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
    1. Tach!

      Ich hab da mal ein Problem. Ich suche die Zeichenkodierung …

      Wozu musst du die finden?

      Na, um sie richtig interpretieren zu können. In dem Fall, um sie nach UTF-8 übersetzen zu können.

      Anstatt ewig auf der Suche zu sein, bist du vielleicht besser daran, wenn du:

      Ja, erstmal schien es einfacher zu sein, die verwendete Kodierung zu verwenden, denn dann kann das Programm sich mit einem einzelnen Funktionsaufruf um die Umkodierung kümmern. Nur hat das mit CP850 nur teilweise zum Erfolg geführt.

      1. den Text als Windows-1252-codiert (oder auch Codepage-850-codiert) betrachtest,

      CP850 ist nicht Windows-1252. Letzeres ist mit ISO-8859-1 verwandt. Ich fahre derzeit wegen der Umlaute mit CP850 am besten.

      1. alle Nicht-ASCII-Zeichen und Umlaute maskierst: s/[^ -~ÄÖÜäöü]/➡️$1⬅️/

      Ich hab keinen HTML-Kontext und muss sie auf andere Weise finden. Aber das werde ich im Laufe des Tages hinbekommen.

      dedlfix.

      1. Hallo und guten Morgen,

        Ich hab keinen HTML-Kontext und muss sie auf andere Weise finden. Aber das werde ich im Laufe des Tages hinbekommen.

        Wenn Du ein bisschen mehr darüber rauslassen würdest, aus welchem Umfeld die Dateien überhaupt stammen, dann könnte man die Anzahl der möglichen Vermutungen schon mal ein wenig eingrenzen. Was ist, wenn sich da jemand eine eigene Kodierung ausgedacht hat und auf diese Weise geheime Botschaften austauscht?

        Du wolltest doch erst einmal feststellen, wie groß der benutzte Zeichenvorrat überhaupt ist.

        Grüße
        TS

        --
        es wachse der Freifunk
        http://freifunk-oberharz.de
        1. Tach!

          Wenn Du ein bisschen mehr darüber rauslassen würdest, aus welchem Umfeld die Dateien überhaupt stammen, dann könnte man die Anzahl der möglichen Vermutungen schon mal ein wenig eingrenzen. Was ist, wenn sich da jemand eine eigene Kodierung ausgedacht hat und auf diese Weise geheime Botschaften austauscht?

          Verschwörungstheorien können wir außen vorlassen. ;) Das Ziel war und ist nur "ganz normale Datenspeicherung" ohne Verschleierungsabsicht. Das System hat bei Datenbank-Feldern vom Typ Text nur eine Kapazität von 250 Zeichen. Größere Datenmengen müssen in BLOB-Feldern abgelegt werden. Anwender hat einen Text in Word verfasst, den kopiert und in ein Text-Eingabefeld eingefügt (da kann man mehr als 250 Zeichen reinwerfen). Nun kam ein Stück Code, dass einen Stream in das BLOB-Feld eröffnet hat und den Inhalt da reinschob. In dem System ist keinerlei Möglichekeit zur Angabe einer Zeichenkodierung vorhanden. Die BLOB-Felder sind für Binärdaten gedacht, da kodiert sich auch nichts gezielt um. Ich muss nun auf die Datenbank zugreifen, und den Inhalt lesen.

          Du wolltest doch erst einmal feststellen, wie groß der benutzte Zeichenvorrat überhaupt ist.

          Ja, kommt noch.

          dedlfix.

          1. Hallo und guten Morgen,

            Das System hat bei Datenbank-Feldern vom Typ Text nur eine Kapazität von 250 Zeichen. Größere Datenmengen müssen in BLOB-Feldern abgelegt werden. Anwender hat einen Text in Word verfasst, den kopiert

            Wie? Per Zischenablage auf WIndows-System?

            und in ein Text-Eingabefeld eingefügt

            Wie? Per Browser auf Windows?
            Welche Codierung verwendet das Dokument?

            (da kann man mehr als 250 Zeichen reinwerfen). Nun kam ein Stück Code, dass einen Stream in das BLOB-Feld eröffnet hat und den Inhalt da reinschob. In dem System ist keinerlei Möglichekeit zur Angabe einer Zeichenkodierung vorhanden.

            In welchem Teil vom System?

            Windows wird vermutlich CP-1252 verwenden. Und es wird, da die Daten erst einmal auf dem System bleiben, an die Zischenablage auch eine Fontangabe für die Revisualisierung der Zeichen mitgeben.

            Der Browser wandelt dann in Zusammenarbeit mit dem OS vermutlich die Zeichen schon mal in UTF-8-Codierung um, um sie dann an das Backend zu senden. Dort werden sie entweder 1:1 byteorentiert in die DB eingetragen, oder aber wenn die ein anderes Transferencoding annimmt, nochmal umcodiert. Wenn jetzt für eine Spalte noch eine weitere Codierung angegeben ist, wird es ganz verrückt.

            Du wirst das (mit Glück) nur mit dem Wissen über den benutzten Font wieder human readable machen können.

            Und die letzte Frage wie immer zum Schluss:
            Kann das DBMS in den Spalten vom Typ Text 250 Bytes, oder 250 Zeichen speichern? Da könnte also auch etwas verloren gegangen sein?

            Grüße
            TS

            --
            es wachse der Freifunk
            http://freifunk-oberharz.de
            1. Tach!

              Das System hat bei Datenbank-Feldern vom Typ Text nur eine Kapazität von 250 Zeichen. Größere Datenmengen müssen in BLOB-Feldern abgelegt werden. Anwender hat einen Text in Word verfasst, den kopiert

              Wie? Per Zischenablage auf WIndows-System?

              Ja.

              und in ein Text-Eingabefeld eingefügt

              Wie? Per Browser auf Windows?
              Welche Codierung verwendet das Dokument?

              Kein Browser im Spiel, kein HTML-Dokument.

              (da kann man mehr als 250 Zeichen reinwerfen). Nun kam ein Stück Code, dass einen Stream in das BLOB-Feld eröffnet hat und den Inhalt da reinschob. In dem System ist keinerlei Möglichekeit zur Angabe einer Zeichenkodierung vorhanden.

              In welchem Teil vom System?

              In allen beteiligten, genaugenommen. Weder in Word, noch der Zwischenanblage, noch dem Zielsystem.

              Windows wird vermutlich CP-1252 verwenden. Und es wird, da die Daten erst einmal auf dem System bleiben, an die Zischenablage auch eine Fontangabe für die Revisualisierung der Zeichen mitgeben.

              Wenn die Umlaute CP850 sind, ist 1252 wohl eher nicht in Verwendung. Die passt weder auf die Umlaute noch auf die anderen Zeichen.

              Kann das DBMS in den Spalten vom Typ Text 250 Bytes, oder 250 Zeichen speichern? Da könnte also auch etwas verloren gegangen sein?

              Irrelevant, weil die wegen ihrer Begrenzung nicht verwendet werden.

              dedlfix.

              1. Hallo dedlfix,

                In dem System ist keinerlei Möglichekeit zur Angabe einer Zeichenkodierung vorhanden.

                In welchem Teil vom System?

                In allen beteiligten, genaugenommen. Weder in Word

                Doch. Word -> Speichern unter -> Tools -> Weboptionen -> COdierung

                Bis demnächst
                Matthias

                --
                Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
                1. Tach!

                  In dem System ist keinerlei Möglichekeit zur Angabe einer Zeichenkodierung vorhanden.

                  In welchem Teil vom System?

                  In allen beteiligten, genaugenommen. Weder in Word

                  Doch. Word -> Speichern unter -> Tools -> Weboptionen -> COdierung

                  Gespeichert wurde in Word nicht. Nur Text geschrieben und in die Zwischenablage kopiert. Speichern ist also nicht Teil des Systems.

                  dedlfix.

                  1. Hallo dedlfix,

                    Doch. Word -> Speichern unter -> Tools -> Weboptionen -> COdierung

                    Gespeichert wurde in Word nicht. Nur Text geschrieben und in die Zwischenablage kopiert. Speichern ist also nicht Teil des Systems.

                    Aber wenn man dieses Weg wählt, kriegt man raus, in welcher Zeichenkodierung dieses Dokument gespeichert werden würde.

                    Bis demnächst
                    Matthias

                    --
                    Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
                    1. Tach!

                      Aber wenn man dieses Weg wählt, kriegt man raus, in welcher Zeichenkodierung dieses Dokument gespeichert werden würde.

                      "Western European (Windows)", sowas ähnliches war zu erwarten. Aber sagt jetzt auch nichts weiter aus, ob das auch für die Zwischenablage gilt.

                      dedlfix.

                      1. Hallo dedlfix,

                        "Western European (Windows)", sowas ähnliches war zu erwarten. Aber sagt jetzt auch nichts weiter aus, ob das auch für die Zwischenablage gilt.

                        Falls noch eine Konsole dazwischen ist … http://www.windowspage.de/tipps/022857.html

                        Bis demnächst
                        Matthias

                        --
                        Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
                      2. Hallo und guten Morgen,

                        "Western European (Windows)", sowas ähnliches war zu erwarten. Aber sagt jetzt auch nichts weiter aus, ob das auch für die Zwischenablage gilt.

                        Nein, in der Zwischenablage befindet sich das Dokument in einem Zwischenformat nebst Formatangaben, also Angaben darüber mit welchen Eigenschaften des Fonts welche Zeichen (eigentlich Objekte) gerendert werden müssen.

                        Grüße
                        TS

                        --
                        es wachse der Freifunk
                        http://freifunk-oberharz.de
                        1. Tach!

                          "Western European (Windows)", sowas ähnliches war zu erwarten. Aber sagt jetzt auch nichts weiter aus, ob das auch für die Zwischenablage gilt.

                          Nein, in der Zwischenablage befindet sich das Dokument in einem Zwischenformat nebst Formatangaben, also Angaben darüber mit welchen Eigenschaften des Fonts welche Zeichen (eigentlich Objekte) gerendert werden müssen.

                          Ja, aber wenn man den Inhalt in ein Textfeld einfügt, dann geht solcherart Formatierungsinformation verloren und es bleibt reiner Text übrig - wie auch immer der kodiert ist.

                          dedlfix.

                          1. Hallo und guten Morgen,

                            Nein, in der Zwischenablage befindet sich das Dokument in einem Zwischenformat nebst Formatangaben, also Angaben darüber mit welchen Eigenschaften des Fonts welche Zeichen (eigentlich Objekte) gerendert werden müssen.

                            Ja, aber wenn man den Inhalt in ein Textfeld einfügt, dann geht solcherart Formatierungsinformation verloren und es bleibt reiner Text übrig - wie auch immer der kodiert ist.

                            Wieviel verloren geht hängt davon ab, ob das Zielprogramm einen Coder bereitstellt, oder ob der Standard-Coder benutzt werden muss.

                            Grüße
                            TS

                            --
                            es wachse der Freifunk
                            http://freifunk-oberharz.de
                    2. Hallo und guten Morgen,

                      Doch. Word -> Speichern unter -> Tools -> Weboptionen -> COdierung

                      Gespeichert wurde in Word nicht. Nur Text geschrieben und in die Zwischenablage kopiert. Speichern ist also nicht Teil des Systems.

                      Aber wenn man dieses Weg wählt, kriegt man raus, in welcher Zeichenkodierung dieses Dokument gespeichert werden würde.

                      Für die Anzeige und Bearbeitung befindet sich das Dokument (bzw. der angezeigte Teil davon) in einem Zwischenformat. Das hat mit der Kodierung zum Speichern in Dateien noch nichts zu tun.

                      Grüße
                      TS

                      --
                      es wachse der Freifunk
                      http://freifunk-oberharz.de
          2. Welche Datenbank ist das?

            1. Tach!

              Welche Datenbank ist das?

              MS-SQL. Ist aber auch nicht weiter von Belang, weil Binärdaten gepeichert werden. Die werden sogar noch mit C#-DeflateStream komprimiert. Der arbeitet auch byteweise und nicht zeichenorientiert, ist also auch nicht der Übeltäter.

              dedlfix.

              1. Hallo und guten Morgen,

                Welche Datenbank ist das?

                MS-SQL. Ist aber auch nicht weiter von Belang, weil Binärdaten gepeichert werden. Die werden sogar noch mit C#-DeflateStream komprimiert. Der arbeitet auch byteweise und nicht zeichenorientiert, ist also auch nicht der Übeltäter.

                Dann fehlen ja jetzt nur noch die Angaben, welcher Requester verwendet wurde und welches (G)UI dafür ;-)

                Grüße
                TS

                --
                es wachse der Freifunk
                http://freifunk-oberharz.de
  4. Ich würde mir solche Dateien mit Komodo in verschiedenen Kodierungen einfach mal angucken.

    .

  5. Hallo und guten Tag,

    besteht auch noch die Frage, mit welchem Tool Du dir das Gespeicherte anschaust?

    Probier mal die Codierung UCS-2.
    Dazu würde auch meine Frage passen, ob es überhaupt Singlebyte-Code ist.

    Könnte nämlich auch sein, dass in der DB noch keine Verluste vorhanden sind, sondern die erst bei der Wiedersichtbarmachung auftreten. Aber das ist nur eine weitere der noch nicht auszuschließenden Ideen.

    Grüße
    TS

    --
    es wachse der Freifunk
    http://freifunk-oberharz.de
    1. Tach!

      besteht auch noch die Frage, mit welchem Tool Du dir das Gespeicherte anschaust?

      Mit dem Microsoft SQL Server Management Studio. Der Inhalt vom Blobfeld wird mir als Hex-Wurst angezeigt. Da ist eine Fehlkodierung ausgeschlossen.

      Probier mal die Codierung UCS-2.
      Dazu würde auch meine Frage passen, ob es überhaupt Singlebyte-Code ist.

      Ja, ist Single-Byte. UCS-2 ist es nicht. Zum einen sind da keine 00-Bytes, und selbst wenn ich sie mir hinzudenken würde, wäre 0084 kein ä.

      Könnte nämlich auch sein, dass in der DB noch keine Verluste vorhanden sind, sondern die erst bei der Wiedersichtbarmachung auftreten. Aber das ist nur eine weitere der noch nicht auszuschließenden Ideen.

      Das BLOB-Feld in der DB ist transparent. Ich bekomme die Zeichen genauso wieder raus und angezeigt, wie sie reingingen. Nur Umkodieren (von CP850) zu UTF-8 bringt halt richtige (z.B. Umlaute) und falsche Zeichen.

      Auffällig ist gerade, dass die falschen Zeichen bei Win-1252 im Bereich 80..9F liegen, der bei ISO-8859-1 nicht definiert ist. Die richtigen Zeichen sind da nicht drin. Die Hexwerte sind aber andere. Also Beispiel: ™ gibts nicht in ISO-8859-1, in Win-1252 ist es 99, aber in meiner Hex-Wurst ist es D9. (Ich bin aber noch nicht durch mit dem Suchen aller Nicht-ASCII-Zeichen.)

      dedlfix.

      1. Hallo Dedlfix,

        Auffällig ist gerade, dass die falschen Zeichen bei Win-1252 im Bereich 80..9F liegen, der bei ISO-8859-1 nicht definiert ist. Die richtigen Zeichen sind da nicht drin. Die Hexwerte sind aber andere. Also Beispiel: ™ gibts nicht in ISO-8859-1, in Win-1252 ist es 99, aber in meiner Hex-Wurst ist es D9. (Ich bin aber noch nicht durch mit dem Suchen aller Nicht-ASCII-Zeichen.)

        Das wird ja langsam wirklich spannend und gibt mir inzwischen ein gutes Gefühl dafür, wie sich die Daten-Archäologen von Morgen anstrengen müssen, um noch 'was zu retten von unserem Pseudo-Wissen...

        Grüße
        TS

        --
        es wachse der Freifunk
        http://freifunk-oberharz.de
      2. Hallo dedlfix,

        Also Beispiel: ™ gibts nicht in ISO-8859-1, in Win-1252 ist es 99, aber in meiner Hex-Wurst ist es D9. (Ich bin aber noch nicht durch mit dem Suchen aller Nicht-ASCII-Zeichen.)

        Nur mal nachgefragt: m1684332 hast du gesehen?

        Bis demnächst
        Matthias

        --
        Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
        1. Tach!

          Nur mal nachgefragt: m1684332 hast du gesehen?

          Die Beschreibung da ist zu vage, keine Angabe, um welche Kodierungen oder Zeichen es sich handelt. Und Änderungen an der Registry fallen auch flach.

          dedlfix.

      3. Tach!

        Auffällig ist gerade, dass die falschen Zeichen bei Win-1252 im Bereich 80..9F liegen, der bei ISO-8859-1 nicht definiert ist. Die richtigen Zeichen sind da nicht drin. Die Hexwerte sind aber andere. Also Beispiel: ™ gibts nicht in ISO-8859-1, in Win-1252 ist es 99, aber in meiner Hex-Wurst ist es D9. (Ich bin aber noch nicht durch mit dem Suchen aller Nicht-ASCII-Zeichen.)

        Von dieser Regel gibt es nur eine Ausnahme: ƒ. Ich bin vorläufig fertig mit dem Thema. Stand ist, dass die Kodierung CP850 ist, aber Zeichen, die in Windows-1252 zwischen 80 und 9F liegen, sind anstelle einiger Rahmenzeichen platziert. Hier die vollständige Tabelle der Abweichungen zu CP850: links die Bytewerte, die ich bekomme, rechts die Werte der entsprechenden Windows-1252-Zeichen. (Die Leerzeilen sind die entsprechenden Fehlstellen in Win-1252.)

        B0, 80
        
        B2, 82
        
        B3, 84
        B4, 85
        B9, 86
        BA, 87
        BB, 88
        BC, 89
        BF, 8A
        C0, 8B
        C1, 8C
        
        C3, 8E
        
        C8, 91
        C9, 92
        CA, 93
        CB, 94
        CC, 95
        CD, 96
        CE, 97
        D5, 98
        D9, 99
        DA, 9A
        DB, 9B
        DC, 9C
        
        F2, 9E
        FE, 9F
        

        dedlfix.