jis2004判別 – プログラミング – Home

通知
すべてクリア

jis2004判別


よすけ
 よすけ
(@よすけ)
ゲスト
結合: 24年前
投稿: 4
Topic starter  

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
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

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

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


返信引用
yoh2
 yoh2
(@yoh2)
ゲスト
結合: 19年前
投稿: 70
 

>     // 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という表現が使われています。
</蛇足>


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました