- 締切済み
vb2008 MIDB関数
VB2008を勉強しながら、プログラム開発を行っています。 VB6の時にはMIDB関数が存在したのですが、VB2008では、MIDB関数が無くなっていました。 プログラム作成にあたり、文字列のバイト操作が必要になり、Leftb、RitghB、MIDBを 作成しているのですが、全く分からない状態です。 SHIFT-JISコードに変換してバイト配列よりすればいいと他のサイトに載っていたので それを参考にしていたのですが、全角文字が存在した時に、文字化けをおこしてしまい 正常な文字で表示されないようになってしまいました。 全角文字の半分の1バイトの場所での指定だったので文字化けを起こしている事は 分かったのですが、これを空白にする事は可能なのでしょうか? また、バイト操作を行うサンプル等がありましたら、教えて頂けないでしょうか? 以上
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- nda23
- ベストアンサー率54% (777/1415)
文字列をShift-JISで考えている時点で、 間違っています。VB内では文字は全て Unicodeです。以前のバージョンと互換 するためAsc関数はShift-JISのコードを 返していますが、実情を正確に表しては いません。生のShift-JIS文字列を扱う つもりならByte型配列を使う必要があり ます。何をしたいのか分かりませんが、 「文字」を1字ずつ扱う時は全角半角に 関わらず必ずMidやLeftのようにBの無い 関数を使わなければいけません。 これが内部形式上も正しい扱いなのです。 文字コードの変換ならEncodingを用いる ことで操作できます。 http://dobon.net/vb/dotnet/string/getencoding.html また、WindowsAPIを利用すると現在の 文字列がShift-JISで何バイトになるかを 求めることもできます。 http://msdn.microsoft.com/ja-jp/library/cc410906.aspx http://www5b.biglobe.ne.jp/~yone-ken/VBNET/special/sp06_GetPrivateProfileString.html lstrlenはANSI用を使うため、正確な名前は "lstrlenA"になります。 配列は以下のようにインスタンス化して 使います。 Dim S As Integer Dim B() As Byte S = 7 '配列の要素数 B = New Byte(S) {} あとは配列ですからインデックスで 修飾して普通に使えばよいでしょう。
- vbhanatyan
- ベストアンサー率79% (70/88)
確かに、LenB 関数等はなくなりましたが、VB6.0 でもそうですが、半角文字も全角文字も2バイト として換算されますので、文字数×2 と同じ事で、必要性がなくなったので廃止されたものと 思われます。 但し、半角文字を1バイト、全角文字文字を2バイトとしてバイト数を求めたいなら下記のように します。 Dim str1 As String = "123あいう" Dim LenB As Integer Dim s_jis As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS") LenB = s_jis.GetByteCount(str1) Debug.WriteLine(LenB.ToString) '結果 9 '又は LenB = System.Text.Encoding.GetEncoding("shift-jis").GetByteCount(str1) Debug.WriteLine(LenB.ToString) '結果 9 LenB = System.Text.Encoding.GetEncoding(932).GetByteCount(str1) Debug.WriteLine(LenB.ToString) '結果 9 '参考 システムの現在の ANSI コード ページのエンコーディングに必要なバイト数 Debug.WriteLine(System.Text.Encoding.Default.GetByteCount(str1)) '結果 9