VB6での文字列のカウント方法(謎)

Goolge+が無くなると聞いたので、いくつかの記事をこちらへコピーしておこう。これは2013/11/22に書いた記事。

VB6でのテキスト文字列のカウント方法。昔のソースコードを探していくと、テキストの文字列をカウントする調査ソフトが見つかった。昔、悩んだ記憶があるなあ。



LENはVB6の文字数カウント関数、LENBはバイト数を返す関数。
StrConv(s, vbUnicode) はテキストをユニコードに変換する関数。

  1. LEN
  2. LENB
  3. Len(StrConv(s, vbUnicode))
  4. LenB(StrConv(s, vbUnicode))

3番目はユニコードの文字数をカウント、4番目はユニコードのバイト数をカウントしている。
「あ」の場合は3番目は「2」になるが、「わ」の場合はなぜか「1」になる。




これは、LEN関数を使ったらまずいことがあったので、わざわざ面倒な式を使ったのだよねえ。しかし、その「まずい理由」が記録されていないので、なぜ変えたのかがわからない。LEN関数を使うように変えたら別の問題が浮上するのだろうか。

「𠮷」はSQLServerに登録すると2文字分を消費するらしい。ユニコードのサロゲート文字という種類の文字ではそうなるらしい。SQLServerのnvarcharは2バイト単位なので、3バイト、4バイトのユニコード文字は2文字分を消費するということなのだろう。

あと、VB6で文字列の長さをチェックする式も見つけたのだが、これは何をしているのだろう?

  • m = Int((Len(StrConv(s, vbUnicode)) + 1) / 2)

この計算式だと、200文字のテキストが180文字くらいになる。謎だ。



テストデータ
あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん

コメント

このブログの人気の投稿

varchar をデータ型 numeric に変換中に、算術オーバーフロー エラーが発生しました。