Command-Line

在 unix 命令行上轉換 Unicode 規範化形式

  • October 31, 2021

在 Unicode 中,某些字元組合具有不止一種表示形式。

例如,字元ä可以表示為

  • “ä”,即程式碼點 U+00E4(c3 a4UTF-8 編碼中的兩個字節),或者作為
  • “ä”,即兩個程式碼點 U+0061 U+0308(61 cc 88UTF-8 中的三個字節)。

根據 Unicode 標準,這兩種表示是等價的,但採用不同的“規範化形式”,請參閱UAX #15: Unicode Normalization Forms

unix 工具箱有各種文本轉換工具,sedtriconv、 Perl 浮現在腦海。如何在命令行上進行快速簡單的 NF 轉換?

您可以使用ICUuconv中的實用程序。規範化是通過音譯 ( ) 實現的。-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包中。

Pythonunicodedata在其標準庫中有模組,允許通過unicodedata.normalize()函式轉換 Unicode 表示:

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 不太適合 shell one 襯裡,但如果您不想創建外部腳本,可以這樣做:

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

對於 Python 2.x,您必須添加編碼行 ( # -*- coding: utf-8 -*-) 並使用 u 字元將字元串標記為 Unicode:

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

引用自:https://unix.stackexchange.com/questions/90100