iconvによる文字コード変換テーブルのカスタマイズ方法
日本語文字コードにはローマ数字のようにIBM拡張文字とNEC選定文字の両方に定義されている文字があります。
同じ文字として定義されてしまっており完全な相互変換は不可能なため、AIXではIBM拡張文字への変換が優先されています。
そのため、NEC選定文字に対してiconvを実行するとIBM拡張文字に変換されます。
# perl -le 'print pack("H*", "875487558756")' | iconv -f IBM-943 -t IBM-943 | od -xc
0000000 fa4a fa4b fa4c 0a00
Ⅰ ** Ⅱ ** Ⅲ ** \n
# perl -le 'print pack("H*", "8ff3ab8ff3ac8ff3ad")' | iconv -f IBM-eucJP -t IBM-943 | od -xc
0000000 fa4a fa4b fa4c 0a00
Ⅰ ** Ⅱ ** Ⅲ ** \n
この文書ではカスタマイズの例としてNEC選定文字への変換を優先する文字コード変換テーブルの作成方法を記載します。
まず、bos.loc.adt.iconvをインストールします。
下記ファイルが配置されたことを確認したら、ファイルの中を確認します。
/usr/lib/nls/loc/uconvTable/IBM-943.ucmap
下記のように同じUTFの文字コード(U+XXXX)に対して、2つのSHIFT-JIS文字コード(\xXX\xXX)があることを確認します。
<U2160> \xFA\x4A
<U2160> \x87\x54
こちらの例の場合は\xFA\x4AがIBM拡張文字です。
重複文字の一覧は下記のコマンドで確認できます。
# awk '{ print $1 }' /usr/lib/nls/loc/uconvTable/IBM-943.ucmap | grep "^<U" | sort | uniq -c | grep "^ [ ]*2" | awk '{ print $2 }'
ここからがカスタマイズ手順になります。
始めにucmapファイルをコピーします。
# cd /usr/lib/nls/loc/uconvTable/
# cp IBM-943.ucmap IBM-943_NEC.ucmap
次にvi等でファイルを開き、先ほどの重複文字の順番を逆にします。
# vi IBM-943_NEC.ucmap
例)
<U2160> \xFA\x4A
<U2160> \x87\x54
編集が終わったらuconvdefコマンドで変換モジュールを作成します。
# uconvdef -f IBM-943_NEC.ucmap IBM-943_NEC
新しく作成したモジュールでNEC選定文字に変換されることを確認します。
# perl -le 'print pack("H*", "875487558756")' | iconv -f IBM-943_NEC -t IBM-943_NEC | od -xc
0000000 8754 8755 8756 0a00
Ⅰ ** Ⅱ ** Ⅲ ** \n
# perl -le 'print pack("H*", "8ff3ab8ff3ac8ff3ad")' | iconv -f IBM-eucJP -t IBM-943_NEC | od -xc
0000000 8754 8755 8756 0a00
Ⅰ ** Ⅱ ** Ⅲ ** \n
参考:
uconvdef コマンド
https://www.ibm.com/docs/ja/aix/7.3?topic=u-uconvdef-command
uconvdef ソース・ファイル・フォーマット
https://www.ibm.com/docs/ja/aix/7.3?topic=formats-uconvdef-source-file-format
日本語コード一覧表
https://public.dhe.ibm.com/systems/power/docs/aix/53/nl/ja/jp_codebook.pdf
注意:
IBM-943などの事前定義の変換モジュールを置き換えることはサポートされないため、必ず別名で変換モジュールを作成します。