ソースをutf-8で統一したい
Windows環境のgcc(Cygwin等)で日本語を使用する場合、少し工夫が必要だった。具体的には
printf("表示");
は
printf("\x95\x5c示");
のように記述する必要があった。これは、昔から有名な現象で、「表」をcp932で表現すると、2バイト目がバックスラッシュとコードが一致するので、エスケープ文字と認識されてしまい、意図した出力にならない。
しかし何時の間にか gcc もソースコードをutf-8で記述できるようになっていた(気付くのが遅いよ)。以下のように記述すると、ソースはutf-8だが、実行時はcp932で出力してくれる。
--exec-charset=cp932 --input-charset=utf-8
という事は、ソースコードはutf-8で統一出来る環境になりつつあるという事だ。
そうすると、既存の cp932 で記述しているソースを utf-8 に変換したくなるわけだ。
Cygwinのsh(bash)でスクリプトを作成してnkfで纏めてファイルのコード変換を行なってみた。
#!/bin/sh if [ -z "$*" ]; then echo usage $0 'filename...' exit 1 fi while [ -n "$1" ]; do echo "$1" cp "$1" "$1".bak nkf --utf8 "$1".bak > "$1" shift done
基本的にはこの方法で問題無いのだが、意図的にソース中に「ハンカクカナ」を使用している場合、問題が発生する。
>type hankaku-kana.txt 意図的にハンカクカナを使用している場合 >nkf --utf8 hankaku-kana.txt | nkf --windows 意図的にハンカクカナを使用している場合
半角カナが全角カナに変換される。ある意味、これは便利なのだが、機能が「半角カナから全角に変換する」だった場合、正常に動作しなくなってしまう。
で、nkf ではなく、iconv でも試してみた。
>type hankaku-kana.txt 意図的にハンカクカナを使用している場合 >iconv -t utf-8 -f cp932 hankaku-kana.txt | iconv -f utf-8 -t cp932 意図的にハンカクカナを使用している場合
iconvの場合は、そのまま半角カナで出力されるようだ。
でも、よく調べたら、nkfでもオプションで抑止できる事がわかった。
X,x Convert Halfwidth Katakana to Fullwidth or preserve it
>nkf --utf8 -x hankaku-kana.txt | nkf -x --windows 意図的にハンカクカナを使用している場合
結局、nfkでもiconvでも可能という事なのだった。