文字化け分かったぁ

偶数文字だと化けて、奇数だと化けないという奇妙な文字化け。デバッグ文入れて、プログラムを追い掛け回してやっと解決した。そもそも、このプログラムはEUCで書いてあったのだが、これをUTF-8に書き換えた。その際、プログラム中にEUCと書いてあるところをgrepで探し、全部UTF-8に書き換えた。この中にテキストボックスの変換処理が含まれていたのだった。テキストボックスへの入力はShift-JISなので、これをEUCに変換していた。ところが、今回の変更で入出力も全部UTF-8になったので、この変換は不要だったのだ。にもかかわらずShift-JISからUTF-8への変換関数を呼んでいる箇所があった。この変換はライブラリで行われている。
ここからは推測なのだが、おそらく「奇数バイトかつすべてのバイトのトップビットがON」の場合は、半角カナ文字の処理が行われ、それ以外の場合は、通常の処理が行われていたのではないかと思われる。UTF-8文字コードは一般に1文字が3バイトであり、かつすべての日本語文字は各バイトのトップビットがONになっている。従って、奇数文字だと、最初の条件にマッチして、半角カナ文字として処理される。このときは変換処理が走らず、文字化けが起こらない。しかし、偶数文字の場合は、最初の条件にマッチしないので、通常の変換処理が走り、結果として文字化けが起こっていたのではないかと考えている。
いやー、面白いバグだったねぇ。丸1日くらい悩んでしまった。