Я пытаюсь определить странный символ, который я нашел в файле, с которым я работаю:
$ cat file
�
$ od file
0000000 005353
0000002
$ od -c file
0000000 353 \n
0000002
$ od -x file
0000000 0aeb
0000002
Файл использует кодировку ISO-8859 и не может быть преобразован в UTF-8:
$ iconv -f ISO-8859 -t UTF-8 file
iconv: conversion from `ISO-8859' is not supported
Try `iconv --help' or `iconv --usage' for more information.
$ iconv -t UTF-8 file
iconv: illegal input sequence at position 0
$ file file
file: ISO-8859 text
Мой главный вопрос: как я могу интерпретировать результаты od
здесь? Я пытаюсь использовать эту страницу, которая позволяет мне переводить между различными символьными представлениями, но она говорит мне, что 005353
«шестнадцатеричная кодовая точка» - это то, 卓
что не кажется правильным, 0aeb
а «шестнадцатеричная кодовая точка» - ૫
это то, что, опять же, кажется неправильным ,
Итак, как я могу использовать любого из трех вариантов ( 355
, 005353
или 0aeb
) , чтобы выяснить , какой характер они должны представлять?
И да, я пробовал использовать инструменты Unicode, но он также не является допустимым символом UTF:
$ uniprops $(cat file)
U+FFFD ‹�› \N{REPLACEMENT CHARACTER}
\pS \p{So}
All Any Assigned Common Zyyy So S Gr_Base Grapheme_Base Graph X_POSIX_Graph
GrBase Other_Symbol Print X_POSIX_Print Symbol Specials Unicode
если я понимаю описание символа Unicode U + FFFD, это вообще не настоящий символ, а заполнитель поврежденного символа. Что имеет смысл, поскольку файл на самом деле не в кодировке UTF-8.
источник
iconv
жалуется, потому что вы не указали исходный набор символов, поэтому он использует ваше значение по умолчанию, которое, вероятно, UTF-8.)ë
это то , что я вижу, когда данные используются в другой программе! Но как я могу это знать? Разве это не где-то в данных, которые я предоставляю? Как ты это нашел? О, я пыталсяiconv
с,-f ISO-8859
но он жаловался наconversion from
ISO-8859 «не поддерживается».eb
и игнорировать0x
шестнадцатеричный индикатор или что-то еще. Мое незнание такого рода вещей глубоко. Не могли бы вы опубликовать ответ, объясняющий, что @StephenKitt?iconv
бы ты преуспел; и / или вы могли бы посмотреть это, например, в Википедии. Для этой очень специфической кодировки также работает fileformat.info/info/unicode/char/00eb/index.htm (Unicode эквивалентен ISO-8859-1 в диапазоне 128-255, хотя, конечно, ни одна UTF-кодировка не совместима с ним ).Ответы:
Ваш файл содержит два байта, EB и 0A в шестнадцатеричном виде. Вполне вероятно, что файл использует набор символов с одним байтом на символ, такой как ISO-8859-1 ; в этом наборе символов EB - это:
Другими кандидатами будут δ в кодовой странице 437 , Ù в кодовой странице 850 ...
od -x
вывод в этом случае сбивает с толку из-за порядка байтов; лучший вариант,-t x1
который использует одиночные байты:od -x
карты, наod -t x2
которые считываются два байта за раз, а в системах с прямым порядком байтов выводятся байты в обратном порядке.Когда вы сталкиваетесь с файлом, подобным этому, который не является допустимым UTF-8 (или не имеет смысла, когда интерпретируется как файл UTF-8), не существует надежного способа автоматического определения его кодировки (и набора символов). Контекст может помочь: если это файл, созданный на западном ПК в последние пару десятилетий, вполне вероятно, что он закодирован в ISO-8859-1, -15 (вариант Euro) или Windows-1252; если он старше, CP-437 и CP-850 являются вероятными кандидатами. Файлы из восточноевропейских систем, российских систем или азиатских систем будут использовать разные наборы символов, о которых я мало что знаю. Тогда есть EBCDIC ...
iconv -l
перечислит все наборы символов,iconv
о которых знает, и вы можете продолжить методом проб и ошибок оттуда.(В какой-то момент я знал наизусть большинство CP-437 и ATASCII, это были дни.)
источник
ë
описывается как00EB
и234
. Что это за лишнее00
? И почему это не так,355
как я ожидал отod
выхода? Я пытаюсь получить более общий ответ о том, как я могу использоватьod
выходные данные для идентификации персонажа. Не могли бы вы объяснить что-то о интерпретации шестнадцатеричных кодов и / или какая информация необходима для идентификации неизвестного символа (кодирование и все остальное)?353
. Таким образом, 353 является восьмеричным представлением, а не десятичным. Argh.od
восьмеричном означает ;-).�
(U + FFFD) будет отображаться эмулятором терминала в качестве замены этого байта 0xeb, который не образует допустимый символ в UTF-8. Непонятно, почемуuniprops $(cat file)
(пропущенные кавычки) сообщит об этом (я не знаю об этойuniprops
команде).unicode "$(cat file)"
на Debian выводит так,Sequence '\xeb' is not valid in charset 'UTF-8'
как я ожидал.Обратите внимание, что
od
это сокращение от восьмеричного дампа , поэтому005353
два байта в виде восьмеричного словаod -x
представлены0aeb
в шестнадцатеричном формате как слово, а фактическим содержимым вашего файла являются два байтаeb
и0a
в шестнадцатеричном формате, в этом порядке.Так что и то,
005353
и другое0aeb
не может быть интерпретировано как «шестнадцатеричный код».0a
является переводом строки (LF) иeb
зависит от вашей кодировки.file
просто угадывает кодировку, это может быть что угодно. Без какой-либо дополнительной информации, откуда поступил файл и т. Д., Это будет трудно выяснить.источник
od -c
так как это производит вывод, который я могу понять. Как я мог использовать то,355
что производит, чтобы идентифицировать персонажа? И почему он печатает,0aeb
аeb0a
если0a
перевод строки?Невозможно со 100% точностью угадать кодировку текстовых файлов.
Такие инструменты, как chardet , firefox , file -i, когда явно не определена информация о наборе символов (например, если HTML содержит метасимвол = ... в голове, все проще), будут пытаться использовать эвристику, которая не так уж плоха, если текст достаточно большой.
Далее я продемонстрирую обнаружение кодировки с помощью
chardet
(pip install chardet
/apt-get install python-chardet
при необходимости).После того , как кандидат хорошо кодировок, мы можем использовать
iconv
,recode
или аналогичные изменения файл кодового к вашей «активной» кодировке (в моем случае UTF-8) и посмотреть , если он угадал правильно ...Некоторые наборы символов (например, iso-8859-3, iso-8859-1) имеют много общих символов - иногда непросто увидеть, нашли ли мы идеальный набор символов ...
Поэтому очень важно иметь метаданные, связанные с соответствующим текстом (например, XML).
источник
iconv -f ... -t utf-8
покажет тебе символы?iso-8850-1
. iso-8859 является стандартом iso и включает несколько определений chaset. Попробуйтеfile -i ...
iconv -f ISO-8859-1 -t UTF-8 file
Если я получу файл, который содержит, например, Слово Бегрунг, я могу сделать вывод, что Бегруссунг может иметь в виду. Поэтому я конвертирую его по всем известным кодировкам и смотрю, найден ли он, и который правильно конвертирует.
Обычно существует несколько кодировок, которые подходят.
Для более длинных файлов вы можете вырезать фрагмент вместо преобразования сотен страниц.
Я бы назвал это
и сценарий проверяет, преобразует ли его с известными кодировками, какой из них производит «Begrüßung».
Чтобы найти таких персонажей, обычно помогает меньше, потому что часто выделяются забавные персонажи. Из контекста обычно можно вывести правильное слово для поиска. Но мы не хотим проверять с помощью hexeditor, что это за байт, а затем посещать бесконечные таблицы кодировок, чтобы найти нашего обидчика. :)
источник