Преобразование текста в 7-битный ASCII из командной строки
Вопрос
Я нахожусь на OS X 10.5.5 (хотя это не имеет большого значения, я думаю)
У меня есть набор текстовых файлов с причудливыми символами, такими как двойные кавычки, многоточия (" ... ") в одном символе и т. д.
Мне нужно преобразовать эти файлы в старый добрый простой 7-разрядный ASCII, желательно без потери символьного значения (то есть преобразовать эти эллипсы в три периода, обратные кавычки в обычные " s и т. д.).
Посоветуйте какой-нибудь умный инструмент / скрипт командной строки (bash), чтобы сделать это.
Решение
Веб-браузер Elinks преобразует сущности Unicode в их эквиваленты ASCII, давая такие вещи, как " - & Quot; для " & # 8212; " и " ... " для " & # 8230; " и т. д. Существует модуль python python-elinks которая использует ту же таблицу преобразования, и было бы тривиально превратить ее в фильтр оболочки, например так:
#!/usr/bin/env python
import elinks
import sys
for line in sys.stdin:
line = line.decode('utf-8')
sys.stdout.write(line.encode('ASCII', 'elinks'))
Другие советы
iconv должен это сделать. Не уверен на 100% в том, как он обрабатывает преобразования, в которых один входной символ должен / может стать несколькими выходными символами, например, в примере с многоточием ... Что-то попробовать!
Обновление: я попробовал, и, похоже, это не работает. Сбой, возможно, потому что он не знает, как выразить многоточие (тестовый символ, который я использовал) в «меньшем». кодирование. Преобразование из UTF-8 в UTF-16 прошло нормально. : / Тем не менее, iconv, возможно, стоит продолжить расследование.
Посмотрите на инструменты транслитерации; Мне нравится Unidecode (в Perl) и не так сложно портировать на другие языки.
Я использовал iconv, чтобы преобразовать файл из UTF-16LE (с прямым порядком байтов, как я обнаружил методом проб и ошибок), который был создан TextPad в Windows, в ASCII в OSX следующим образом:
cat utf16file.txt |iconv -f UTF-16LE -t ASCII > asciifile.txt
Вы также можете передавать через hexdump, чтобы увидеть символы и убедиться, что вы получаете правильный вывод, терминал знает, как интерпретировать UTF-16, и отображает его правильно, так что вы не можете просто сказать, но делаете 'cat' в файле:
cat utf16file.txt | iconv -f UTF-16LE -t ASCII | hexdump -C
Это показывает макет с шестнадцатеричными кодировками символов и символами ASCII справа, и вы можете попробовать различные кодировки в -f " из " параметр, чтобы выяснить, с чем вы имеете дело.
Используйте 'iconv -l' для просмотра списка символов, который iconv может использовать в вашей системе.
Вчера или накануне был вопрос о переименовании файлов, и я показал Perl-скрипт rename.pl
, который можно было бы использовать для этой задачи. Проблемной областью является знание того, как кодируются нечетные символы, и разработка правильной последовательности транслитераций. Я, вероятно, сделал бы это с помощью адаптации того сценария, который делал все сопоставления последовательно. Делать это по одному персонажу за раз было бы излишне неудобно.
Вопрос был: Как переименовать с префиксом / суффиксом