外字を含むかどうかの判断

解決


ちゃまき  2012-06-11 10:49:33  No: 147642  IP: 192.*.*.*

VB2010を使用しています。
Z1=人物名とする場合
If "F040" <= Hex(Asc(VBStrings.Mid$(Z1, intIndex, 1))) And _
                      Hex(Asc(VBStrings.Mid$(Z1, intIndex, 1))<= "F9FC" Then 
でVB6のときはZ1 に外字を含むかどうかの判断ができていたのですが、
VB2010ではこの条件でひっかかってくれません。
コード的にエラーにもなってないので、原因がわかりません。
どうすれば、うまく外字を判断できるのでしょうか?

編集 削除
ちゃまき  2012-06-11 11:03:53  No: 147643  IP: 192.*.*.*

"F040"→"FFFFF040"
"F9FC"→"FFFFFCFC" とすることで解決しました。
お騒がせしました。

編集 削除
YuO  2012-06-11 12:01:46  No: 147644  IP: 192.*.*.*

解決となっていますが……。

If Char.GetUnicodeCategory(Z1, intIndex - 1) = System.Globalization.UnicodeCategory.PrivateUse Then
の方がよいでしょう。
外字はWindows-31jで表せない領域にも定義可能ですので。
# 「外字」はUnicodeの「私用領域」に割り付けられます。

編集 削除
ちゃまき  2012-06-11 12:11:41  No: 147645  IP: 192.*.*.*

YuOさん
ありがとうございます。
解決したと思ってましたが、あれでは全て外字を抽出できなかったんですね。
勉強になりました。

編集 削除
魔界の仮面弁士  2012-06-11 18:57:39  No: 147646  IP: 192.*.*.*

「外字を含むかどうか」を VB2010 で判定させるなら、
Dim hasGaiji As Boolean = Z1.Any(Function(c) Char.GetUnicodeCategory(c) = UnicodeCategory.PrivateUse)
のようにすれば、ループ処理させずに判定できますね。


2005 以下においては拡張メソッドが使えませんが、その場合でも
Dim hasGaiji As Boolean = Regex.IsMatch(Z1, "\p{IsPrivateUseArea}")
のように、正規表現で判定することができます。
http://msdn.microsoft.com/ja-jp/library/20bw873z.aspx

# Regex.IsMatch(Z1, "\p{Co}") でも可。

編集 削除