Преобразуйте между Формами нормализации Unicode на командной строке Unix

Не это столь же простое как

$ cd /directory/whose/files/you/need/to/open
$ gedit *

Я просто попробовал это geany и это работает.

23
10.09.2013, 21:47
3 ответа

Можно использовать uconv утилита от ICU. Нормализация достигается посредством транслитерации (-x).

$ uconv -x any-nfd <<<ä | hd
00000000  61 cc 88 0a                                       |a...|
00000004
$ uconv -x any-nfc <<<ä | hd
00000000  c3 a4 0a                                          |...|
00000003

На Debian, Ubuntu и других производных, uconv находится в libicu-dev пакет. На Fedora, Red Hat и других производных, и в портах BSD, это находится в icu пакет.

20
27.01.2020, 19:41
  • 1
    Это работает, спасибо. Необходимо установить 30M dev библиотека вместе с ним все же. Что хуже, я не смог найти необходимую документацию для самого uconv: где Вы находили any-nfd? Похоже, что от разработки этого инструмента отказались, последнее обновление было в 2005. –  glts 14.09.2013, 19:07
  • 2
    @glts я нашел any-nfd путем просматривания списка, отображенного uconv -L. –  Gilles 'SO- stop being evil' 15.09.2013, 02:38

Python имеет unicodedata модуль в его стандартной библиотеке, которые позволяют переводить представления Unicode через unicodedata.normalize() функция:

import unicodedata

s1 = 'Spicy Jalape\u00f1o'
s2 = 'Spicy Jalapen\u0303o'

t1 = unicodedata.normalize('NFC', s1)
t2 = unicodedata.normalize('NFC', s2)
print(t1 == t2) 
print(ascii(t1)) 

t3 = unicodedata.normalize('NFD', s1)
t4 = unicodedata.normalize('NFD', s2)
print(t3 == t4)
print(ascii(t3))

Выполнение с Python 3.x:

$ python3 test.py
True
'Spicy Jalape\xf1o'
True
'Spicy Jalapen\u0303o'

Python не хорошо подходит для оболочки лайнеры, но это может быть сделано, если Вы не хотите создавать внешний сценарий:

$ python3 -c $'import unicodedata\nprint(unicodedata.normalize("NFC", "ääääää"))'
ääääää

Для Python 2.x необходимо добавить строку кодирования (# -*- coding: utf-8 -*-) и метка представляет в виде строки как Unicode с u символом:

$ python -c $'# -*- coding: utf-8 -*-\nimport unicodedata\nprint(unicodedata.normalize("NFC", u"ääääää"))'
ääääää
7
27.01.2020, 19:41

Проверьте его с помощью инструмента hexdump:

echo  -e "ä\c" |hexdump -C 

00000000  61 cc 88                                          |a..|
00000003  

convert с iconv и проверьте еще раз с помощью hexdump:

echo -e "ä\c" | iconv -f UTF-8-MAC -t UTF-8 |hexdump -C

00000000  c3 a4                                             |..|
00000002

printf '\xc3\xa4'
ä
3
27.01.2020, 19:41

Теги

Похожие вопросы