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

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

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

Re[2]: バイト数から文字数を割り出す


(過去ログ 138 を表示中)

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

■81233 / inTopicNo.1)  バイト数から文字数を割り出す
  
□投稿者/ よしえ (1回)-(2016/09/04(Sun) 16:08:10)

分類:[.NET 全般] 

VB.NETです。

全角文字と半角文字が混ざった文字列があり、
その文字列を
Dim r2() As Byte = Encoding.Default.GetBytes(text)

でバイト配列に変換した後、
あるプログラムで指定したバイト文字がある位置を特定します。

そのバイト配列上で特定した文字が
元の文字列の何文字目にあるか知りたいのですがどうすれば良いですか?
全てが半角文字であれば、バイト数から計算できますが
全角文字も混ざっている場合にはどうすれば良いですか?







引用返信 編集キー/
■81234 / inTopicNo.2)  Re[1]: バイト数から文字数を割り出す
□投稿者/ 魔界の仮面弁士 (870回)-(2016/09/04(Sun) 16:39:03)
No81233 (よしえ さん) に返信
> Dim r2() As Byte = Encoding.Default.GetBytes(text)

Shift_JIS 環境、すなわち、Encoding.Default が
Encoding.GetEncoding(932) 相当を返すという前提で回答しますね。


> そのバイト配列上で特定した文字が
> 元の文字列の何文字目にあるか知りたいのですがどうすれば良いですか?

この場合、「.GetString(r2)」で 得られる String 値
(あるいは元となった「text」)に対して、
String.IndexOf メソッドを使うことで調査できます。

String.IndexOf の使用例はこちら。
http://dobon.net/vb/dotnet/string/stringindexof.html


> 全角文字も混ざっている場合にはどうすれば良いですか?

Shift_JIS の場合、先頭から辿っていかないと文字の区切りを判別できません。

たとえば &H81 と &H82 だけで構成されたバイト列があったします。
これらは半角文字では使われず、全角文字でだけ使われるコードですが、
それ単体では全角文字の 1 バイト目か 2 バイト目か判断が付かないのです。

  &H81,&H81 → =(全角イコール)
  &H81,&H82 → ≠(全角ノットイコール) 
  &H82,&H81 → a(全角小文字エー)
  &H82,&H82 → b(全角小文字ビー)


UTF-8 などは、バイト列の途中からでも文字列の区切り位置がわかるのですけれどね。
引用返信 編集キー/
■81235 / inTopicNo.3)  Re[1]: バイト数から文字数を割り出す
□投稿者/ WebSurfer (1022回)-(2016/09/04(Sun) 17:22:11)
No81233 (よしえ さん) に返信

> 全角文字と半角文字が混ざった文字列があり、

質問者さんの言う「全角文字と半角文字」の定義は何でしょう?

VB.NET の String オブジェクトは Char 構造体のシーケンシャルコレクションで、「半角
文字」とか「全角文字」という概念はないのですが・・・

詳しい説明は以下の記事を見てください。

Char 構造体
https://msdn.microsoft.com/ja-jp/library/system.char(v=vs.100).aspx

Shift_JIS の 1 バイト文字を「半角文字」、2 バイト文字を「全角文字」といってますか?

とすると、Shift_JIS に含まれない文字(サロゲートも)はどう考えるのですか?

引用返信 編集キー/
■81238 / inTopicNo.4)  Re[2]: バイト数から文字数を割り出す
□投稿者/ よしえ (3回)-(2016/09/04(Sun) 18:11:54)
String.IndexOf でうまくいきました
どうもありがとうございます。
 サロゲートも勉強になりました

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -