- PR -

VB.NETで文字列長の取得方法

投稿者投稿内容
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2007-09-01 23:53
おせわになります。

現在VB.NET(VB2005)でプログラムを作成しているのですが、
実際の文字列の長さを半角→1,全角→2として取得したい場合
どうすればよいのでしょうか?
(※文字数やバイト数を取得したいわけではありません。)
用途としては画面入力時のチェック用として使いたいと思っています。

とりあえずテスト用に作成してみた下記の関数で取得できそうなのですが、
なにかとても無駄なことをしているような気分になります…

もっと一般的な方法がありましたら是非教えてください。
よろしくお願いいたします。

--------------------------------------------------------------------------
Private Function 文字列長取得(ByVal 対象文字列 As String) As Integer

Dim 半角カナ As String = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッー゙゚、。・「」"

Dim srtLength = 対象文字列.Length

Dim 文字列長 As Integer = 0

For i As Integer = 0 To srtLength - 1

Dim 対象文字 As String = 対象文字列.Substring(i, 1)

If 半角カナ.Contains(対象文字) Then
文字列長 += 1
Continue For
End If

Dim SJIS As System.Text.Encoding = System.Text.Encoding.UTF8
If SJIS.GetByteCount(対象文字) = 1 Then
文字列長 += 1
Continue For
Else
文字列長 += 2
Continue For
End If

Next

Return 文字列長

End Function


じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-09-02 00:04
StringInfo クラスを調べるが吉でしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-09-02 00:13
引用:

ハニワ祭りさんの書き込み (2007-09-01 23:53) より:
実際の文字列の長さを半角→1,全角→2として取得したい場合
どうすればよいのでしょうか?
(※文字数やバイト数を取得したいわけではありません。)
もっと一般的な方法がありましたら是非教えてください。
よろしくお願いいたします。



私は半角・全角の正確な定義をよく知りませんが、
Shift-JIS時代と同様な振舞いを期待するなら
Shift-JISに変換してバイト数を見れば、
普通に言われている全角は2、半角は1で数えてくれます。
これが最も一般的方法かと思っています。

もちろん、UTF-16で表現できるがShift-JISで表現できない文字があると
いろいろ問題が生じますので、対策を講じる必要があります。

もし半角・全角の明確な定義を持っているのでしたら、
それに従い正規表現などで対応することになるかと思います。
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2007-09-02 00:26
れい殿>

引用:

れいさんの書き込み (2007-09-02 00:13) より:

もちろん、UTF-16で表現できるがShift-JISで表現できない文字があると
いろいろ問題が生じますので、対策を講じる必要があります。

もし半角・全角の明確な定義を持っているのでしたら、
それに従い正規表現などで対応することになるかと思います。



一般的に使用される日本語固定ピッチフォント(MS ゴシックなど)で
Shift-Jisで1byteとして表現できる英数字などの
2倍の幅を持つ文字を全角と考えています。

またShift-JISで表現できない文字が存在するため、
Shift-JISに変換してバイト数で判別することは
不可能だと思っており、サンプルではUTF8で判別してみました。

じゃんぬねっと殿>
StringInfo クラスを調べてみます。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2007-09-02 01:18
引用:

ハニワ祭りさんの書き込み (2007-09-02 00:26) より:
Shift-JISに変換してバイト数で判別することは
不可能だと思っており、サンプルではUTF8で判別してみました。


単にShift_JISに変換できなければ2にするんなら、EncoderFallbackを適当に設定したらいけるかな。
サロゲートなどは扱い方によって別途判断しないといけないかもしれませんが。
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2007-09-02 02:16
引用:

なちゃさんの書き込み (2007-09-02 01:18) より:
単にShift_JISに変換できなければ2にするんなら、EncoderFallbackを適当に設定したらいけるかな。
サロゲートなどは扱い方によって別途判断しないといけないかもしれませんが。



サロゲート文字が1全角文字分多くカウントされる件については、
DB登録前のエラーチェックなので、現時点ではむしろありだと思っています。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-09-02 04:58
引用:

ハニワ祭りさんの書き込み (2007-09-02 00:26) より:
一般的に使用される日本語固定ピッチフォント(MS ゴシックなど)で
Shift-Jisで1byteとして表現できる英数字などの
2倍の幅を持つ文字を全角と考えています。



普通の定義ですね。
この定義は文字がShift-JIS内で表現できるというのが前提の定義です。

引用:

またShift-JISで表現できない文字が存在するため、



Shift-JISで表現できない文字が存在する場合は、
上記定義では、足りません。
Shift-JISに存在しない文字をどう扱うのでしょうか?

Encodingで変換した際、
変換できない文字は既定では「?」になりますので、
Shift-JISで表現できない文字を「1」と数えるなら
強引にShift-JISに変換してバイト数を見ればOKです。

Shift-JISで表現できない文字を「2」と数えるなら
コード:
        Dim fallback As New System.Text.EncoderReplacementFallback("□")
        Dim encoding As System.Text.Encoding
        encoding = System.Text.Encoding.GetEncoding("Shift-JIS").Clone
        encoding.EncoderFallback = fallback


とかやって、変換できない文字を全角に変換してから数えればいいでしょう。

変換できない文字毎にどうするか決定したいなら
なちゃさんの言うようにEncoderFallbackを自分で実装する必要があります。
サロゲートペアもこれで対応できます。

Unicodeで定義されてるカテゴリ毎に対応したい場合は
StringInfoや正規表現で対応するほうがいいでしょう。
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2007-09-02 12:04
皆様。分からないことがあるので質問させて下さい。

本件、入力された文字列がデータベースに格納できるサイズか調べたいんですよね?
SQLが以下のように流れるとして、それぞれの文字コードはどうなるんでしょうか?


    1.入力コントロール(TextBox.Text?)
    2.VBアプリ内部のSQL(Dim sql as String?)
    3.DBクライアント
    4.データベース内部

スキルアップ/キャリアアップ(JOB@IT)