アプリ版:「スタンプのみでお礼する」機能のリリースについて

VB2008で全角半角の判定
VB6 では下記のようにして判定していましたが、VB2008では
どのようにすればよいのかお教えください。

 dim moji as string
dim zhN as integer
 zhN = LenB(StrConv(moji, vbFromUnicode))

mojiには1文字格納されており、
 半角なら zhN = 1 全角なら zhN = 2
となる。

 これをVB2008で実現する方法がわかりません。
 よろしくお願いします。

A 回答 (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では複数の文字コード表に対応しています、そのため、エンコードを指定してバイト数を取得する必要が出てきました。
    • good
    • 0
この回答へのお礼

3つのステートメントが同じとは!!
いい勉強になりました。
有難うございました。

お礼日時:2009/05/07 11:12

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)

補足日時:2009/05/01 18:59
    • good
    • 0
この回答へのお礼

レス ありがとうございます。
私には大変難しい内容で勉強させていただきます。

お礼日時:2009/04/30 20:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!