Hier ist eine Zeichenfolge aus einer Textdatei:
@ ™ Tda®®ÆÆ ƒƒƒŒ ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver Å Å Åjjjjjj
Es enthält viele nicht druckbare Zeichen und wird hier kopiert: https://pastebin.com/TUG4agN4
Verwenden https://2cyr.com/decode/?lang=de können wir bestätigen, dass es sich um Folgendes handelt:
☆ Tda 式 照 れ ミ ク ス ト ー ト ・ ビ キ ニ ニ 1 1 1 1 1 1 1 1 1 1 1 1
Dies ist mit Quellcodierung = SJIS (shift-jis), angezeigt als Windows-1252.
Aber wie können wir dasselbe Ergebnis ohne Website erzielen? Das relevante Werkzeug ist iconv, aber etwas in der Werkzeugkette ist defekt. Wenn ich versuche, aus der Quelltextdatei zu katzen oder sie als Standardeingabe mit '& lt;' in bash ist eines der 'iconv's in der kette schnell fehlerhaft. Wenn ich den obigen String aus dem Texteditor gedit (das Lesen der Datei als utf-16le) oder als Ausgabe von iconv mit utf16-to-utf8-Konvertierung kopiert, ist das Ergebnis zwar nahe, aber immer noch falsch:
@ 儺 式 式 れ ミ ミ ス ト ト [ト E ビ ビ 1 1 1 1d 1d 1d 1d 1 1 1 1 1 1 .1 .1 .1 .1 .1 .1 .1 .1 .1 .1 .1
Einige Beweise dafür, dass die Werkzeugkette versagt:
$ cat 'utf8.txt' | head -1
@ ™ Tda®®ÆÆ ~NƒƒƒƒŒ gŒŒŒrƒƒŒjŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver ver Å Å Å Å Å Å Å Å Å Å Å Å Å Å Å
$ cat 'utf8.txt' | head -1 | iconv -f utf8 -t utf16
@ "! Tda} ~ N X g R [ g E r L jver1.11d1.d2 i r L j f Ver9 ver.1.1 } z "z j
Beachten Sie beim Start drei ungültige Zeichen.
$ cat 'utf8.txt' | head -1 | iconv -f utf8 -t utf16 | iconv -f utf16 -t windows-1252
iconv: unzulässige Eingabesequenz an Position 2
$ echo "@ ™ Tda®® ® ~ ƒNƒXƒgƒŒ [ƒgEƒrƒLƒjver1.11d1.d2iƒrƒLƒjƒƒƒƒƒƒƒƒ verƒƒƒƒƒƒ verƒƒƒƒƒƒ verƒƒƒƒƒƒƒ verƒƒƒƒƒƒ ƒ ƒ ver ³ .1 ³” ”j" "" "" "" "" "" "" "" "" " iconv -f utf8 -t utf16
@ "! Tda} ~ N X gverR [ gE rverL jver1.11d1.d2i r L j f 9 ver.1.1 } z "z j
Beachten Sie beim Start zwei ungültige Zeichen, andere Unterschiede. Die vom Terminal kopierte Sequenz stimmt mit der im Texteditor angezeigten Zeichenfolge überein. Bestätigt wird dies mit übereinstimmender Suche (Strg-F). Dies ist die gleiche Zeichenfolge, die auf 2cyr.com das richtige Ergebnis liefert.
Wenn Sie den letzten Befehl mit '| iconv -f utf16 -t windows-1252 | iconv -f shift-jis -t utf8' erweitern, erhalten Sie das schließende, aber falsche Ergebnis, das oben zitiert wurde, und nicht wie bei der direkten Kette.
Wenn ich versuchte, eine Datei mit dem Namen "Beispielstring" zu erstellen und das Tool "convmv" darauf zu verwenden, sagte convmv, der Ausgabedateiname enthielt "Zeichen, die nicht dem POSIX-Dateisystem entsprechen. Die meisten Dateinamen, die mit UTF-8 ungültig sind, geben diese Warnung nicht aus.
Gibt es eine Bitsequenz, die das Piping in Bash nicht verarbeiten kann? Wenn nicht, warum funktioniert die Werkzeugkette nicht?
Anscheinend besteht der Unterschied darin, dass bash keine nicht gedruckten Zeichen (die Kästen mit Zahlen) in die Befehlszeile einfügt. vielleicht kann 'readline' nicht damit umgehen? Das Ergebnis der Annäherung legt jedoch nahe, dass die Konvertierungsreihenfolge in der Toolchain korrekt ist. Warum funktioniert sie dann nicht?
Die Originaldatei, deren Dateiname auf andere Weise verschlüsselt wurde (verfällt nach 30 Tagen): https://ufile.io/oorcq
quelle