Преобразование текста в 7-битный ASCII из командной строки - PullRequest
4 голосов
/ 17 октября 2008

Я на OS X 10.5.5 (хотя, думаю, это не имеет большого значения)

У меня есть набор текстовых файлов с причудливыми символами, такими как двойные кавычки, многоточия ("...") в одном символе и т. Д.

Мне нужно преобразовать эти файлы в старый добрый простой 7-битный ASCII, желательно без потери символьного значения (то есть преобразовать эти эллипсы в три периода, обратные кавычки в обычные "s" и т. Д.).

Пожалуйста, посоветуйте какой-нибудь умный инструмент командной строки (bash) для этого.

Ответы [ 5 ]

2 голосов
/ 17 октября 2008

Веб-браузер Elinks преобразует сущности Unicode в их эквиваленты ASCII, давая такие вещи, как "-" для "-" и "..." для "..." и т. Д. Есть питон модуль 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'))
1 голос
/ 10 декабря 2008

Я использовал iconv, чтобы преобразовать файл из UTF-16LE (little-endian, как я обнаружил методом проб и ошибок), который был создан 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 "from", чтобы выяснить, с чем вы имеете дело.

Используйте 'iconv -l', чтобы вывести список наборов символов, которые iconv может использовать в вашей системе.

1 голос
/ 17 октября 2008

Посмотрите на инструменты транслитерации; Мне нравится Unidecode (в Perl), и не так уж сложно портировать на другие языки.

1 голос
/ 17 октября 2008

iconv должен сделать это, насколько я знаю. Не уверен на 100% в том, как он обрабатывает преобразования, когда один входной символ должен / может стать несколькими выходными символами, например, в примере с многоточием ... Что-то попробовать!

Обновление: я попробовал, и кажется, что это не работает. Сбой, возможно, так как он не знает, как выразить многоточие (тестовый символ, который я использовал) в «меньшей» кодировке. Преобразование из UTF-8 в UTF-16 прошло нормально. : / Все же, iconv, возможно, стоит продолжить расследование.

0 голосов
/ 17 октября 2008

Вчера или накануне был вопрос о переименовании файлов, и я показал Perl-скрипт rename.pl, который можно было бы использовать для этой задачи. Проблемной областью является знание того, как кодируются нечетные символы, и разработка правильной последовательности транслитераций. Я, вероятно, сделал бы это с помощью адаптации того сценария, который делал все сопоставления последовательно. Делать это по одному персонажу за раз было бы излишне сложно.

Вопрос был: Как переименовать с префиксом / суффиксом

...