- ベストアンサー
VB2008で全角半角の判定
VB2008で全角半角の判定 VB6 では下記のようにして判定していましたが、VB2008では どのようにすればよいのかお教えください。 dim moji as string dim zhN as integer zhN = LenB(StrConv(moji, vbFromUnicode)) mojiには1文字格納されており、 半角なら zhN = 1 全角なら zhN = 2 となる。 これをVB2008で実現する方法がわかりません。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
zhN = System.Text.Encoding.GetEncoding("ShiftJIS").GetByteCount(moji) と zhN = System.Text.Encoding.GetEncoding(932).GetByteCount(moji) と zhN = System.Text.Encoding.Default.GetByteCount(moji) は同じ意味です。 エンコーディング名"ShiftJIS"のIDが932番です。 1番上はエンコーディング名よりIDを取得し、IDから情報を取得します。 2番目はIDから情報を取得します。 3番目はデフォルト(初期設定時の選択言語が日本語であればShift-JIS)で使用されている情報を使用します。 取り出す手間がかからない分、下に行くにつれて速度が上がります。 さらに蛇足ですが、エンコーディングとはどの文字コード(エンコード)に対応付けするかを意味します。 文字コード表は見たことありますでしょうか? ASCIIコード表あたりが見やすいので検索してみてください、イメージがつかめます。 コンピュータは、例ですが(1,1)は'a'、(1,2)は'b'といった具合に番地に文字が割り当てられている表を使用し、バイトデータを文字に置き換えています。 VBなどで使用されている文字コードはユニコードです。 ユニコードは最大4byteで一文字をあらわします、ShiftJISは最大2byteで文字をあらわします。 ユニコードでは"あ"は3byteですが、シフトジスでは2byteです。 別の文字コードにEUCがありますが、 EUCで半角文字の"ア"は2byteですが、シフトジスでは1byteとなります。 .NETFrameworkでは複数の文字コード表に対応しています、そのため、エンコードを指定してバイト数を取得する必要が出てきました。
その他の回答 (1)
- himajin100000
- ベストアンサー率54% (1660/3060)
Option Explicit On Option Strict On Option Compare Binary Option Infer Off Class Q4916265 Shared Sub Main() '半角が1バイトで全角が2バイトかどうかは '文字符号化方式にもよる(たとえばUTF-8では"あ"は3バイト。多分UTF-16では"a"も2バイト)なので厳密に言わないといけない。 'ここでは勝手にCP932を選んだ。 Dim str As String = "a" If str.Length <> 1 Then throw new System.IndexOutOfRangeException End If Dim enc1 As System.Text.Encoding = System.Text.Encoding.GetEncoding(932) '本当は 'enc.EncoderFallbackやenc.DecoderFallbackも検討すべき。 System.Console.WriteLine(enc1.GetBytes(str).Length) 'というような形になるでしょう。 System.Console.ReadKey(True) End Sub End Class
お礼
レス ありがとうございます。 私には大変難しい内容で勉強させていただきます。
補足
いろいろ調べた結果 下記のように zhN の右辺を変更することでうまくいきそうです。 moji が全角なら zhN は 2 , 半角なら 1 になります。 vb2008 express edition で確認しました。 dim moji as string dim zhN as integer zhN = System.Text.Encoding.GetEncoding("ShiftJIS").GetByteCount(moji)
お礼
3つのステートメントが同じとは!! いい勉強になりました。 有難うございました。