2008-10-17 3 views
4

Я на OS X 10.5.5 (хотя это не имеет большого значения, я думаю)Преобразование текста в 7-битным ASCII из командной строки

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

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

Для этого необходимо использовать инструмент/скрипт командной строки (bash).

ответ

2

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

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

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

+0

Я не нашел правильный набор параметров, чтобы заставить iconv сделать это. Вы можете предложить его? –

1

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

0

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

Вопрос был: How to rename with prefix/suffix

1

Я использовал Iconv для преобразования файлов из UTF-16LE (прямой порядок байтов, как я узнал, путем проб и ошибок), которая была создана TextPad в Windows, в ASCII на OSX, как это :

cat utf16file.txt |iconv -f UTF-16LE -t ASCII > asciifile.txt 

вы можете труба через шестнадцатеричный, а также для просмотра символов и убедитесь, что вы получаете правильный вывод, терминал знает, как интерпретировать UTF-16 и отображает его правильно, так что вы не можете сказать, просто но делает «cat» в файле:

cat utf16file.txt | iconv -f UTF-16LE -t ASCII | hexdump -C 

Это показывает расположение с шестнадцатеричными кодами символов и символами ASCII с правой стороны, и вы можете попробовать различные кодировки в параметре -f "from", чтобы выяснить, с чем вы имеете дело.

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

+0

Это работает, но вам нужно будет добавить --unicode-subst = ###, если у вас есть символы высокого порядка. – Benjamin

0

версия python3:

#!/usr/bin/env python3 
import sys 
import elinks 
for line in sys.stdin: 
    sys.stdout.write(line.encode('ASCII', 'elinks').decode('utf-8')) 

Стоит отметить, что python-elinks чисто питон; реальной установки не требуется.