Вот строка из текстового файла:
@ ™ TdaŽ®Æ,êƒ ~ ƒNƒXƒgƒŒ [ƒgEƒrƒLƒjver1.11d1.d2iƒrƒLƒjƒ,ƒfƒ <ver.1.1³Ž®»г • г» Aj
Он содержит много непечатаемых символов и копируется здесь: https://pastebin.com/TUG4agN4
Используя https://2cyr.com/decode/?lang=en, мы можем подтвердить, что это означает следующее:
☆ Tda 式 照 れ ミ ク ス ト レ ー ト · ビ キ ニ ver1.11d1.d2 (ビ キ ニ モ デ ル Ver.1.1 正式 配 布 版)
Это с исходной кодировкой = SJIS (shift-jis), отображаемой как Windows-1252.
Но как мы можем получить тот же результат без веб-сайта? Соответствующим инструментом является iconv, но что-то в цепочке инструментов не работает. Если я попытаюсь выполнить cat из исходного текстового файла или использовать его в качестве стандартного ввода с помощью «<» в bash, один из «iconv» в цепочке быстро выдаст ошибку. Если я скопирую приведенную выше строку из текстового редактора gedit (читая файл как utf-16le) или как вывод с помощью iconv с преобразованием utf16-to-utf8, то результат будет близким, но все же неправильным:
@ 儺 да 式 ニ れ ミ ク ス ト レ [ト E ビ キ ニ ver1.11d1.d2i ビ キ ニ モ デ ル ver.1.1 ウ 式 配 布 版 J
Некоторые доказательства того, что цепочка инструментов не работает:
$ cat 'utf8.txt' | head -1
@ ™ TdaŽ®Æ,êƒ ~ ƒNƒXƒgƒŒ [ƒgEƒrƒLƒjver1.11d1.d2iƒrƒLƒjƒ,ƒfƒ <ver.1.1³Ž®»г • г» Å
$ 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�9 ver.1.1�� } "Z" z ��j
Обратите внимание на три недопустимых символа в начале.
$ cat 'utf8.txt' | head -1 | iconv -f utf8 -t utf16 | iconv -f utf16 -t windows-1252
iconv: недопустимая последовательность ввода в позиции 2
$ echo "@ ™ TdaŽ®Æ‚êƒ ~ ƒNƒXƒgƒŒ [ƒgEƒrƒLƒjver1.11d1.d2iƒrƒLƒjƒ‚ƒfƒ‹ ver.1.1³Ž® ”z • z” Åj "| iconv -f utf8 -t utf16
@ "!Tda} �� �� ~ �N�X�g�R [�gE�r�L�jver1.11d1.d2i�r�L�j� �f�9 ver.1.1�} � z "z �j
Обратите внимание на два недопустимых символа в начале, другие различия. Последовательность, скопированная из терминала, совпадает со строкой, отображаемой в текстовом редакторе, подтверждается соответствующей ей командой find (ctrl-F), которая является той же строкой, которая дает правильный результат на 2cyr.com.
Расширение последней команды выше с помощью '| iconv -f utf16 -t windows-1252 | iconv -f shift-jis -t utf8' дает приведенный выше закрывающий, но неверный результат, вместо того, чтобы выдавать ошибку, как это делает прямая цепочка.
Если я попытался создать файл с именем примера строки и использовать для него инструмент convmv, convmv сказал, что имя выходного файла содержит символы, которые не соответствуют файловой системе POSIX! Это может привести к потере данных. "Большинство имен файлов, которые недопустимы с UTF-8, не выдают это предупреждение.
Есть ли какая-нибудь последовательность битов, которую не может обработать piping в bash? Если нет, то почему цепочка инструментов не работает?
Очевидно, разница в том, что bash не вставляет непечатаемые символы (поля с цифрами) в командную строку; Может быть, «readline» не может справиться с ними? Но близкий результат говорит о том, что порядок преобразования в цепочке инструментов правильный, так почему же он не работает?
Исходный файл с его именем файла шифруется другим способом (срок действия истекает через 30 дней): https://ufile.io/oorcq