Command-Line
在 unix 命令行上轉換 Unicode 規範化形式
在 Unicode 中,某些字元組合具有不止一種表示形式。
例如,字元ä可以表示為
- “ä”,即程式碼點 U+00E4(
c3 a4
UTF-8 編碼中的兩個字節),或者作為- “ä”,即兩個程式碼點 U+0061 U+0308(
61 cc 88
UTF-8 中的三個字節)。根據 Unicode 標準,這兩種表示是等價的,但採用不同的“規範化形式”,請參閱UAX #15: Unicode Normalization Forms。
unix 工具箱有各種文本轉換工具,sed、tr、iconv、 Perl 浮現在腦海。如何在命令行上進行快速簡單的 NF 轉換?
您可以使用ICU
uconv
中的實用程序。規範化是通過音譯 ( ) 實現的。-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
包中。
Python
unicodedata
在其標準庫中有模組,允許通過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"ääääää"))' ääääää