- - PR -
VB.NETで文字列長の取得方法
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 | ||||||||||||
|
投稿日時: 2007-09-02 00:04
StringInfo クラスを調べるが吉でしょう。
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2007-09-02 00:13
私は半角・全角の正確な定義をよく知りませんが、 Shift-JIS時代と同様な振舞いを期待するなら Shift-JISに変換してバイト数を見れば、 普通に言われている全角は2、半角は1で数えてくれます。 これが最も一般的方法かと思っています。 もちろん、UTF-16で表現できるがShift-JISで表現できない文字があると いろいろ問題が生じますので、対策を講じる必要があります。 もし半角・全角の明確な定義を持っているのでしたら、 それに従い正規表現などで対応することになるかと思います。 | ||||||||||||
|
投稿日時: 2007-09-02 00:26
れい殿>
一般的に使用される日本語固定ピッチフォント(MS ゴシックなど)で Shift-Jisで1byteとして表現できる英数字などの 2倍の幅を持つ文字を全角と考えています。 またShift-JISで表現できない文字が存在するため、 Shift-JISに変換してバイト数で判別することは 不可能だと思っており、サンプルではUTF8で判別してみました。 じゃんぬねっと殿> StringInfo クラスを調べてみます。 | ||||||||||||
|
投稿日時: 2007-09-02 01:18
単にShift_JISに変換できなければ2にするんなら、EncoderFallbackを適当に設定したらいけるかな。 サロゲートなどは扱い方によって別途判断しないといけないかもしれませんが。 | ||||||||||||
|
投稿日時: 2007-09-02 02:16
サロゲート文字が1全角文字分多くカウントされる件については、 DB登録前のエラーチェックなので、現時点ではむしろありだと思っています。 | ||||||||||||
|
投稿日時: 2007-09-02 04:58
普通の定義ですね。 この定義は文字がShift-JIS内で表現できるというのが前提の定義です。
Shift-JISで表現できない文字が存在する場合は、 上記定義では、足りません。 Shift-JISに存在しない文字をどう扱うのでしょうか? Encodingで変換した際、 変換できない文字は既定では「?」になりますので、 Shift-JISで表現できない文字を「1」と数えるなら 強引にShift-JISに変換してバイト数を見ればOKです。 Shift-JISで表現できない文字を「2」と数えるなら
とかやって、変換できない文字を全角に変換してから数えればいいでしょう。 変換できない文字毎にどうするか決定したいなら なちゃさんの言うようにEncoderFallbackを自分で実装する必要があります。 サロゲートペアもこれで対応できます。 Unicodeで定義されてるカテゴリ毎に対応したい場合は StringInfoや正規表現で対応するほうがいいでしょう。 | ||||||||||||
|
投稿日時: 2007-09-02 12:04
皆様。分からないことがあるので質問させて下さい。
本件、入力された文字列がデータベースに格納できるサイズか調べたいんですよね? SQLが以下のように流れるとして、それぞれの文字コードはどうなるんでしょうか? 1.入力コントロール(TextBox.Text?) 2.VBアプリ内部のSQL(Dim sql as String?) 3.DBクライアント 4.データベース内部 |