完全に個人的な備忘録

完全に個人的な備忘録。学習コストが高くなってきたので、メモしておかないと…片っ端から忘却の彼方なのです。

ソースを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でも可能という事なのだった。