わかりきったことではありますが、VB 内部の文字コードは Unicode です。Unicode とは何か、ということはここでは端折りますが (*1)、まぁ、VB4 が出てから 4 年も経とうというのに、LenB() が偶数しか返さないのはなぜですか、という人が多いのには恐れ入ります。
前に、今は RAD で EUC な時代だから、詳しくない人が増えてもしょうがないよね。という話をしましたが、これはちょっと事情が違います。こういう疑問を持つのは、シフト JIS という、MBCS のコード体系を知ってる人なのです。つまり、途中で情報収集をやめた人です。少なくとも VB4 が出た当時は、各雑誌が、今度は Unicode だということをかなり取り上げていましたので、不勉強のそしりは免れないでしょう。ついでに言えば、Microsoft の Office 製品が VBA を採用する時もそうでしたので、まぁ、マイナス評定されても文句は言えないんじゃないでしょうか。
混乱の原因の一つは、Win95 や Win98 という OS が、まだシフト JIS コードだということでしょう。OS と開発言語が別の文字コードを使っているというのは、なかなか不思議な状態だと思うのですが (*2)。
他に、テキストボックスやデータベースのフィールドなんかで、入力可能な長さをバイト数で指定するのか文字数で指定するのか、なんて問題もまだまだ残っています。
という状況なので、ある文字がいわゆる「半角」なのか「全角」なのかを判定しなければならない機会というのは、中々なくなりません。
どうすりゃいいでしょうか。
最初に思いつくのは、Unicode の文字列をシフト JIS に変換して、以前の判定ルーチンをそのまま適用することです。StrConv() という関数があるので、あっという間です。これは割と広く使われてるんじゃないでしょうか。
蛇足ですが、この関数は、いわゆる「半角」−「全角」の変換や、カタカナとひらがなの変換をやってくれるので、かなり便利です。
もう一つの方法は、Unicode の特性を利用することです。
最初に「端折る」と宣言したくせに、結局、触れてしまうことになるのですが、いわゆる「半角英数」は、先頭に 0x00(&H00) を付け加えただけで、いままでと同じコードが使えます。
たとえば‘A’は、7bit コードでは 0x41(&H41) ですが、Unicode では 0x0041(&H0041) となります。
つまり、「先頭が 0 でなかったら全角」と考えることができるのです (*3)。
尤も、1 文字を 2 バイトデータとして参照しなければならないので、MidB() で分解して、AscB() で整数値に置き換えることになります。具体的には、
Dim n1st As Integer, n2nd As Integerとなります。n1st と n2nd の順番が逆であることに注意して下さい。
n2nd = AscB(MidB(strTarget, 1, 1))
n1st = AscB(MidB(strTarget, 2, 1))
Print Hex(Asc("あ"))はい、OK ですね。
82A0
解説AscW() っていう関数があるんですね。試しに、
DBCS を使用していないシステムでは、0 〜 225 の範囲の値が返されます。DBCS を使用しているシステムでは、-32768 〜 32767 の範囲の値が返されます。
メモ 文字列に含まれたバイト データを取得するには、AscB 関数を使用します。AscB 関数は、最初の文字の文字コードではなく、最初のバイト データを返します。AscW 関数は、Unicode 文字セットの文字を返します。Unicode をサポートしていないプラットフォームでは、Asc 関数と同じ文字コードを返します。
Print Hex(AscW("あ"))なるほど。Unicode っぽい値になりました。
3042