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

解決


ちゃまき  2012-06-11 19:49:33  No: 147642

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 20:03:53  No: 147643

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


YuO  2012-06-11 21:01:46  No: 147644

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

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


ちゃまき  2012-06-11 21:11:41  No: 147645

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


魔界の仮面弁士  2012-06-12 03:57:39  No: 147646

「外字を含むかどうか」を 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}") でも可。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加