C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: IsDBCSLeadByte の判断がおかしい?


(過去ログ 12 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■3522 / inTopicNo.1)  IsDBCSLeadByte の判断がおかしい?
  
□投稿者/ dash (1回)-(2007/05/14(Mon) 11:05:32)

分類:[VB.NET (Windows)] 

いつもお世話になっております。

現在VB.net2005環境(WinXP SP2)において、
入力された文字列が全角文字の1バイト目かそうでないかを
判断する処理を作っており、IsDBCSLeadByte で判断しているのですが、
どうも結果が正しくないように見えます。

そこで確認のために以下のような処理を作ってみました。

Dim hEncoding As System.Text.Encoding = System.Text.Encoding.GetEncoding("shift_jis")
Dim bBytes As Byte() = hEncoding.GetBytes("あら")

MsgBox IsDBCSLeadByte(bBytes(0)) ' 文字 "あ" の1バイト目
MsgBox IsDBCSLeadByte(bBytes(1)) ' 文字 "あ" の2バイト目
MsgBox IsDBCSLeadByte(bBytes(2)) ' 文字 "ら" の1バイト目
MsgBox IsDBCSLeadByte(bBytes(3)) ' 文字 "ら" の2バイト目

実行結果として、文字 "ら" の2バイト目でも 1 (2バイト文字の1バイト目) が
返されていました。(2バイト文字の2バイト目なので 0 が返るはず)

使い方が間違っているのでしょうか?
他に正しく判断できる方法がありましたら
教えていただけませんでしょうか。

よろしくお願いします。
引用返信 編集キー/
■3523 / inTopicNo.2)  Re[1]: IsDBCSLeadByte の判断がおかしい?
□投稿者/ シャノン (159回)-(2007/05/14(Mon) 11:15:16)
No3522 (dash さん) に返信
> いつもお世話になっております。
>
> 現在VB.net2005環境(WinXP SP2)において、
> 入力された文字列が全角文字の1バイト目かそうでないかを
> 判断する処理を作っており、IsDBCSLeadByte で判断しているのですが、
> どうも結果が正しくないように見えます。

#よくある質問ですね。

IsDBCSLeadByte で判定できるのは、「それが先行バイトの可能性があるかどうか」です。
言いかえれば、あるバイトに対して IsDBCSLeadByte が TRUE を返したとき、かつ、その前のバイトが確実に後続バイトであるときのみ、そのバイトは先行バイトです。
Shift-JIS の仕様で、先行バイトでも後続バイトでもあり得るものがあるため、ある単一のバイトだけを見た時、判定できないケースがあります。
文字列の先頭から目的の位置まで、何度も IsDBCSLeadByte を呼びながら調べてくるしかありません。
引用返信 編集キー/
■3524 / inTopicNo.3)  Re[1]: IsDBCSLeadByte の判断がおかしい?
□投稿者/ ぽぴ王子 (197回)-(2007/05/14(Mon) 11:15:32)
ぽぴ王子 さんの Web サイト
No3522 (dash さん) に返信

とりあえず簡単に。

Shift_JIS の 2 バイト目のコード範囲は、一部 1 バイト目のコード範囲と重
なったコードが割り当てられています。
IsDBCSLeadByte は「Shift_JIS の 1 バイト目のコード範囲か」を調べる関
数なので「Shift_JIS の 2 バイト目のコード範囲か」は考慮していないと思
います。

なので、IsDBCSLeadByte で Shift_JIS の 1 バイト目と判断できたら、その
次のバイトは必ず 2 バイト目である、などの判断になると思います。

Shift_JIS について勉強してみるといろいろとわかると思います。
引用返信 編集キー/
■3525 / inTopicNo.4)  Re[2]: IsDBCSLeadByte の判断がおかしい?
□投稿者/ dash (2回)-(2007/05/14(Mon) 11:34:01)
素早い返答ありがとうございます。
よくある質問でしたか・・・もう少し調べれば見つかったのかな。

例えば、入力文字が "あら" ならば、
IsDBCSLeadByte の戻り値は先頭から順に、
1 0 1 1
となりますが、0 (後続バイト) 以外の後の 1 は
全て 0 と見なせばよいということでしょうか? ( 1 0 1 0 とする)

ついでにもう一つ例を書かせていただくと、
入力が "ららら" ならば、
1 1 1 1 1 1
となるので、
先頭文字の 1 は先行バイトで確定として、
1 0 1 1 1 1

1 0 1 0 1 1

1 0 1 0 1 0

として順に処理してから、対象の文字をチェックするということでしょうか。

>Shift-JIS の仕様で、先行バイトでも後続バイトでもあり得るものがあるため、
>ある単一のバイトだけを見た時、判定できないケースがあります。
これが初耳でしたので、しつこく例を書かせていただきました。すみません。

引用返信 編集キー/
■3526 / inTopicNo.5)  Re[3]: IsDBCSLeadByte の判断がおかしい?
□投稿者/ シャノン (160回)-(2007/05/14(Mon) 11:49:54)
No3525 (dash さん) に返信
> 素早い返答ありがとうございます。
> よくある質問でしたか・・・もう少し調べれば見つかったのかな。

責めているわけではありません。
ご気分を害されましたら申し訳ありません。

> 例えば、入力文字が "あら" ならば、
> IsDBCSLeadByte の戻り値は先頭から順に、
> 1 0 1 1
> となりますが、0 (後続バイト) 以外の後の 1 は
> 全て 0 と見なせばよいということでしょうか? ( 1 0 1 0 とする)

1 1 と続いた場合、どちらかは先行バイトではないのは確かです。
しかし、この2バイトだけを見た時、どちらが先行バイトなのかはわかりません。

> ついでにもう一つ例を書かせていただくと、
> 入力が "ららら" ならば、
> 1 1 1 1 1 1
> となるので、
> 先頭文字の 1 は先行バイトで確定として、
> 1 0 1 1 1 1
> ↓
> 1 0 1 0 1 1
> ↓
> 1 0 1 0 1 0
>
> として順に処理してから、対象の文字をチェックするということでしょうか。

その通りです。
引用返信 編集キー/
■3527 / inTopicNo.6)  Re[4]: IsDBCSLeadByte の判断がおかしい?
□投稿者/ dash (3回)-(2007/05/14(Mon) 11:58:30)
No3526 (シャノン さん) に返信
> 責めているわけではありません。
> ご気分を害されましたら申し訳ありません。
あーいえいえ、ぜんぜん大丈夫ですよ。
丁寧な回答でよくわかりましたし。
それよりも、何度も回答いただきましてありがとうございました。

>
> その通りです。
納得しました。
もう一度ロジックを組みなおしてみます。


ぽぴ王子さんも回答ありがとうございました。
文字コード関連についても少し勉強してみようと思います。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -