Ваш файл содержит два байта, EB и 0A в шестнадцатеричном формате. Вероятно, файл использует набор символов с одним байтом на символ, например ISO-8859-1; в этом наборе символов EB — это ë:
$ printf "\353\n" | iconv -f ISO-8859-1
ë
Другими кандидатами могут быть δ в кодовой странице 437 , Ù в кодовой странице 850 ...
Вывод od -x
в этом случае сбивает с толку из-за порядка следования байтов; лучшим вариантом является -t x1
, который использует одиночные байты:
$ printf "\353\n" | od -t x1
0000000 eb 0a
0000002
od -x
отображается на od -t x2
, который считывает два байта за раз, а на маленьких -endian выводит байты в обратном порядке.
Когда вы сталкиваетесь с таким файлом, который не является допустимым UTF-8 (или не имеет смысла при интерпретации как файл UTF-8), не существует надежного способа автоматически определить его кодировку (и набор символов). ). Контекст может помочь: если это файл, созданный на западном ПК за последние пару десятилетий, есть большая вероятность, что он закодирован в ISO-8859-1, -15 (европейский вариант) или Windows-1252; если он старше, вероятными кандидатами являются CP-437 и CP-850. Файлы из восточноевропейских, российских или азиатских систем будут использовать разные наборы символов, о которых я мало что знаю. Затем есть EBCDIC... iconv -l
выведет список всех наборов символов, о которых знает iconv
, и оттуда вы сможете действовать методом проб и ошибок.
(В какой-то момент я знал большую часть CP-437 и ATASCII наизусть, это были дни.)
Проблема в том, что tp=(...
определяет массив, но $tp
ссылается только на первый элемент массива.
Вам нужно
for i in "${tp[@]}" ; do