В Unicode некоторые комбинации символов имеют более одного представления.
Например, символ ä может быть представлен как
- «ä», то есть кодовая точка U + 00E4 (два байта
c3 a4
в кодировке UTF-8) или как - «ä», то есть две кодовые точки U + 0061 U + 0308 (три байта
61 cc 88
в UTF-8).
Согласно стандарту Unicode, эти два представления эквивалентны, но в разных «формах нормализации», см. UAX # 15: Формы нормализации Unicode .
В наборе инструментов Unix есть все виды инструментов преобразования текста , на ум приходят sed , tr , iconv , Perl. Как я могу быстро и легко конвертировать NF в командной строке?
perl -MUnicode::Normalization -e 'print NFC(
... э-э, что здесь происходит сейчас ...Ответы:
Вы можете использовать
uconv
утилиту от ICU . Нормализация достигается путем транслитерации (-x
).На Debian, Ubuntu и других производных,
uconv
есть вlibicu-dev
пакете. На Fedora, Red Hat и других производных, а также на портах BSD, это вicu
пакете.источник
any-nfd
? Похоже, что разработка этого инструмента была прекращена, последнее обновление было в 2005 году.any-nfd
, просматривая список, отображаемыйuconv -L
.sudo apt install icu-devtools
для запускаuconv -x any-nfc
, но не решить простейшую проблему , например,bugText.txt
файл с «Iglésias, Bad-á, Good-á», преобразованный с помощьюuconv -x any-nfc bugText.txt > goodText.txt
того же текста.Python имеет
unicodedata
модуль в своей стандартной библиотеке, который позволяет переводить представления Unicode черезunicodedata.normalize()
функцию:Запуск с Python 3.x:
Python плохо подходит для оболочек оболочки один, но это можно сделать, если вы не хотите создавать внешний скрипт:
Для Python 2.x необходимо добавить кодировку line (
# -*- coding: utf-8 -*-
) и пометить строки как Unicode с символом u:источник
Проверьте это с помощью инструмента hexdump:
преобразуйте с помощью iconv и проверьте снова с помощью hexdump:
источник
utf-8-mac
Linux и это нормально.Для полноты, с
perl
:источник
Coreutils имеет патч, чтобы получить правильную
unorm
. прекрасно работает на 4-х байтовых wchars. следуйте http://crashcourse.housegordon.org/coreutils-multibyte-support.html#unorm . Остается проблема с 2-байтовыми системами wchar (cygwin, windows, плюс aix и solaris на 32-битных), которые должны преобразовывать кодовые точки из верхнего планы в суррогатные пары и наоборот, и лежащая в основе libunistring / gnulib пока не может справиться с этим.В Perl есть
unichars
инструмент, который также выполняет различные формы нормализации в cmdline. http://search.cpan.org/dist/Unicode-Tussle/script/unicharsисточник
Существует утилита perl под названием Charlint, доступная с
https://www.w3.org/International/charlint/
который делает то, что вы хотите. Вам также придется скачать файл с
ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt
После первого запуска вы увидите, что Charlint жалуется на несовместимые записи в этом файле, поэтому вам придется удалить эти строки из UnicodeData.txt.
источник