原因は、'{' のアスキー文字を、C 言語プログラム中で直接検索していたからでした。
'本' の字はコードでいうと、以下の様になります。
#root@mamushi: echo 本 | od -t x1 -C
0000000 96 7b 0a
本 ** \n
一方、'{' の字はどうかと言うと、
#root@mamushi: echo '{' | od -t x1 -C
0000000 7b 0a
{ \n
0000002
共に同じ 0x7b バイトを使って符号化されています。そのプログラムでは、
マルチバイト文字列を、1 バイトずつ処理するようにして、'{' 文字と比べていた
のです。日本語に対する他の 2 つの符号化方式である、EUC と UTF-8 ロケールでは、 アスキー文字は そのまま使えるので、
問題が起こりませんでした。 PCK の符号化方式では第 1 バイトの値によって
第 2 バイトの解釈が変わり、 通常のアスキー文字に対する符号も他のマルチバイト
文字を表現するのに使われるので、プログラムの意図と違う結果になってしまいました。
ほとんどのコマンドラインプログラムの場合、文字の整形などがないので ワイドキャラクター表現ではなく、そのままのバイト列として扱ってもメッセージの 表示などはうまくいきますが、1 文字ずつの扱いをする際にはワイドキャラクターに 変換して全ての動作を書く必要がありますね。
