Преобразование текста в 7-битный ASCII из командной строки

StackOverflow https://stackoverflow.com/questions/212745

  •  03-07-2019
  •  | 
  •  

Вопрос

Я нахожусь на 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 , который можно было бы использовать для этой задачи. Проблемной областью является знание того, как кодируются нечетные символы, и разработка правильной последовательности транслитераций. Я, вероятно, сделал бы это с помощью адаптации того сценария, который делал все сопоставления последовательно. Делать это по одному персонажу за раз было бы излишне неудобно.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top