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 ;
}
}
このコードは正しいのでしょうか?
よろしくお願いします。
記述されているマクロはサロゲート文字かどうかや
正しいサロゲートペアであるかどうかを判別するためのマクロです。
サロゲート自体はJIS X 0213とはまったく関係ありません。
というか,Unicode 2.0 (@1996年) の頃からすでに存在します。
# jis2004はJIS X 0213と勝手に解釈。
何をしたいのかをもう一度まとめ直してはどうでしょうか。
> // 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という表現が使われています。
</蛇足>