纯 bash 中的字符串规范化

use*_*670 5 unicode bash freebsd utf-8 iconv

字符“E\xcc\x81”( E\\xcc\\x81) 和“\xc3\x89”( \\xc3\\x89) 具有不同的代码点。它们看起来相同,但在测试匹配时结果是否定的。

\n\n

不过,Python 可以对它们进行标准化:unicodedata.normalize('NFC', 'E\xcc\x81'.decode('utf-8')) == unicodedata.normalize('NFC', '\xc3\x89'.decode('utf-8'))返回True. 它打印为 \xc3\x89。

\n\n

问题:有没有办法在纯 bash*中规范化字符串?我已经研究过了iconv,但据我所知它可以转换为 ascii,但没有标准化。

\n\n

*GNU bash,版本 3.2.57(1)-release (x86_64-apple-darwin14))

\n

nj_*_*nj_ 4

如果你有uconv可用,那可能会完成这项工作:

$ echo -en "E\xcc\x81" | uconv -x Any-NFC | hexdump -C
00000000  c3 89
$ echo -en "\xc3\x89" | uconv -x Any-NFC | hexdump -C
00000000  c3 89
Run Code Online (Sandbox Code Playgroud)

Any-NFD也可用于分解形式。