jis2004判別

[戻る]
よすけ 2007/07/10(火) 18:09:14
jis2004判別なんですが、ネットで以下のコードを見つかりました。

#define HIGH_SURROGATE_START 0xd800
#define HIGH_SURROGATE_END 0xdbff
#define LOW_SURROGATE_START 0xdc00
#define LOW_SURROGATE_END 0xdfff

#define IS_HIGH_SURROGATE(wch) (((wch) >= HIGH_SURROGATE_START) && ((wch) <=
HIGH_SURROGATE_END))
#define IS_LOW_SURROGATE(wch) (((wch) >= LOW_SURROGATE_START) && ((wch) <=
LOW_SURROGATE_END))
#define IS_SURROGATE_PAIR(hs, ls) (IS_HIGH_SURROGATE(hs) && IS_LOW_SURROGATE(ls))

wchar, hs, lsのタイプは何かその使い方もよくわからないですけど、一応コードを書い
てみました。

        //テスト用文字列
    char name[] = "叱るalphabet0123カタカナひらがな漢字";

    // jis2004の叱る
    name[0] = 0xd8;
    name[1] = 0x42;
    name[2] = 0xdf;
    name[3] = 0x9f;
    name[4] = 0x30;
    name[5] = 0x8b;

    wchar_t hs, ls; 
        //jis2004用文字列
    wchar_t w_name[sizeof(name) * 2];
        // charからjis2004用の文字列に変換
    MultiByteToWideChar(CP_ACP, 0, name, strlen(name), w_name, sizeof(w_name));

    for(int charIdx = 0; charIdx < strlen(name) - 2; charIdx++) {
        
                // jis2004を判別
        if (IS_SURROGATE_PAIR(w_name[charIdx], w_name[charIdx + 1])) {
            MessageBox( "jis2004文字を見つけました", "エラー", MB_OK );
            return ;
        }
    }

このコードは正しいのでしょうか?

よろしくお願いします。

YuO [E-Mail] 2007/07/10(火) 20:20:19
記述されているマクロはサロゲート文字かどうかや
正しいサロゲートペアであるかどうかを判別するためのマクロです。
サロゲート自体はJIS X 0213とはまったく関係ありません。
というか,Unicode 2.0 (@1996年) の頃からすでに存在します。
# jis2004はJIS X 0213と勝手に解釈。

何をしたいのかをもう一度まとめ直してはどうでしょうか。

yoh2 [E-Mail] 2007/07/10(火) 23:42:53
>     // jis2004の叱る
>     name[0] = 0xd8;
>     name[1] = 0x42;
>     name[2] = 0xdf;
>     name[3] = 0x9f;
>     name[4] = 0x30;
>     name[5] = 0x8b;

上記のコードで、char配列、つまりMBCS(CP932; Shift_JIS + αと言った方が通りがいい
かな)で正字体の「叱る」を表現しようとしているのだと思いますが、0xd842 0xdf9f 
0x308bというwchar_t並び(*)はUNICODE(UTF-16)での「叱る」を表すもので、CP932の表現
ではありません。
ではCP932ではどういったバイト列になるかというと、対応する文字コードはありませ
ん。表現不可能です。
(*) 0xd8 0x42 0xdf 0x9f 0x30 0x8b というchar並びではありません。

別スレッドで、MBCSでは正字体の「叱る.txt」というファイルが開けないだろうと書いた
のはこれが理由です。

結局のところ、MBCSでJIS X 0213:2004の文字コードを扱おうとする姿勢が間違い。
JIS X 0213:2004を扱うならUNICODEで文字列を扱う必要があります。

参考: 複数の事象を混同しがちなVistaの文字問題
http://itpro.nikkeibp.co.jp/article/OPINION/20061211/256530/?ST=vista&P=2


<蛇足>
> # jis2004はJIS X 0213と勝手に解釈。

Microsoftのサイトで、JIS X 0213:2004 = JIS2004としてあちこちにJIS2004という表現
が使われていますね。
その影響を受けてか、ITproや@ITなどの記事でもJIS2004という表現が使われています。
</蛇足>

古いスレッドには追加発言できません。