先日、テスト中に PCK(SJIS) ロケールだけで起こる問題がを見つけ、調べていました。PCK ロケール上で、ある特定の文字を表示しようとする時だけ、うまく行かないとい うものでした。 私が使ったその文字は、'本' の字で、日本語の文字列でも、他のものだときちんと 動作するのに、この文字が入っていると、メッセージが英語で表示されてしまうとい うものでした。

原因は、'{' のアスキー文字を、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 文字ずつの扱いをする際にはワイドキャラクターに 変換して全ての動作を書く必要がありますね。

投稿されたコメント:

コメント
コメントは無効になっています。

This blog copyright 2008 by kazuhiko