dos2unix: двоичный символ 0x04 найден в строке 1703

я загружаю файл из ОЭСР http://stats.oecd.org/Index.aspx?datasetcode=CRS1 ('CRS 2013 data.txt'), выбрав экспорт - > связанные файлы. Я хочу работать с этим файлом в Ubuntu (14.04 LTS).

когда я запускаю:

dos2unix CRS 2013 data.txt

Я вижу:

dos2unix: Binary symbol 0x0004 found at line 1703
dos2unix: Skipping binary file CRS 2013 data.txt

Я проверяю кодировку файла с помощью:

file --mime-encoding CRS 2013 data.txt

и видим:

CRS 2013 data.txt: utf-16le

Я:

iconv -l | grep utf-16le

, который не верните что-нибудь, чтобы я сделал:

iconv -l | grep UTF-16LE

возвращает:

UTF-16LE//

тогда я бегу:

iconv --verbose -f UTF-16LE -t UTF-8 CRS 2013 data.txt -o crs_2013_data_temp.txt

и регистрации:

file --mime-encoding crs_2013_data_temp.txt

и видим:

crs_2013_data_temp.txt: utf-8

тогда я попробую:

dos2unix crs_2013_data_temp.txt

и

dos2unix: Binary symbol 0x04 found at line 1703
dos2unix: Skipping binary file crs_2013_data_temp.txt

Я тогда пытаюсь заставить его:

dos2unix -f crs_2013_data_temp.txt

он работает, т. е. dos2unix завершает преобразование без вытаскивания / жалобы, но когда я открываю файл, я вижу такие записи, как"FoÃ" Ťa и à "ÅšajniÃ" Å e e".

мой вопрос почему? Это потому, что спецификация не видна dos2unix? Потому что он пропал? Разве я не правильно сделал обращение? Как конвертировать этот файл (правильно? чтобы я мог прочесть.

3 ответов


этот символ 0x0004, который вы видите в своем файле, не имеет ничего общего с BOM (что, кстати, нормально)-это символ EOT (конец передачи) из набора управления C0 и был в этой кодовой точке, так как 7-битный ASCII был новой горячностью. (Это также знакомая последовательность Control-D Unix EOF.)

к сожалению, предварительноdos2unix способ применения tr файл, удалять возврата каретки не работают напрямую с файла-UTF-16; с iconv работает для вас, хотя вы можете использовать его для преобразования в UTF-8 (который tr будет работать), а затем запустите это :

tr -d '\r' < crs_2013_data_temp.txt > crs_2013_data_unix.txt

для того, чтобы получить текстовый файл в соглашение о завершении строки Unix. Однако вам придется следить за любыми инструментами, которым вы подаете файл, чтобы убедиться, что они не подавитесь символом Ctrl-D/EOT; если они это сделают, вы можете использовать

tr -d '4' < crs_2013_data_unix.txt > crs_2013_data_clean.txt

, чтобы избавиться от него.

о том, как он получил там в первую очередь? Я виню бельгийцев за то, что они позволили ему проникнуть в данные, которые они дали ОЭСР, которые они, вероятно, ввели с cat - > file или некоторые другие аналогично неутешительные средства. Кроме того, некоторые текстовые редакторы пытаются быть слишком полезными, скрывая символы управления, хотя другие инструменты будут выручать, когда они видят их, поскольку они думают, что вы просто набили двоичный файл, который притворялся текстом на некоторое время.


Я думаю, что эта команда подходит для вашей проблемы:

cat file | tr -d "\r" > new_file

вот как я решал:

find . -type f -exec sed -i 's/\r//' {} \;