📘
【Bash】uconv で濁音・半濁音を NFC/NFD に変換する
uconv は ICU によって開発された文字変換ツールである。Debian の場合 icu-devtools パッケージに含まれている。文字情報を調べてくれる uniname が含まれる uniutils と一緒にインストールする
sudo apt install icu-devtools uniutils
「ぱ」を NFD に変換してみる。基底文字と結合文字の組み合わせになる。
echo -n ぱ | uconv -x NFD | LINES=35 uniname
character byte UTF-32 encoded as glyph name
0 0 00306F E3 81 AF は HIRAGANA LETTER HA
1 3 00309A E3 82 9A ゚ COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
uconv をつなげて生成された文字のコードポイントを求めることができる
echo -n ぱ | uconv -x NFD | uconv -x Hex/Unicode; echo
U+306FU+309A
今度は od
コマンドを使ってバイト列を表示してみる
echo -n ぱ | uconv -x NFD | od -tx1 -An
e3 81 af e3 82 9a
大文字変換も加えてみる
echo -n ぱ | uconv -x NFD | od -tx1 -An | tr [:lower:] [:upper:]
E3 81 AF E3 82 9A
xxd でもバイト列表示ができる
echo -n ぱ | uconv -x NFD | xxd -p -u
E381AFE3829A
xxd の出力結果を調整してみる
str=$(echo -n ぱ | uconv -x NFD | xxd -p -u)
masakielastic@penguin:~$ for (( i = 0; i < ${#str}; i += 2 )); do echo -n "${str:$i:2} "; done; echo;
E3 81 AF E3 82 9A
なお uconv は濁点・半濁点以外に旧字体を新字体に変換してしまうので、大量の文字を変換する場合にはプログラミング言語で正規表現で変換対象をひらがかなカタカナに絞る必要がある
echo 神 | uconv -x NFD
神
Discussion
一部の文字は NFC が正しく動作しないので注意してください。
代替方法の例です。
いつ修正されるのやら
バグ報告ありがとうございます。