全角と半角の判断について

解決


ペンギン  2003-11-26 07:55:00  No: 80558

はじめて利用させていただきます。
早速ですが、ご質問させていただきます。

if [特定の文字列(変数)の30バイト目が全角文字(30,31を跨ぐ文字)だったら]then
    処理
else if [特定の文字列(変数)の30バイト目が半角文字だったら]
    処理
End If

という、全角の時と半角の時で処理を分けたいのですが、どう区別したらいいのか悩んでいます。
スマートにIf文で分けられる良い方法はないでしょうか?


oku  URL  2003-11-26 09:24:44  No: 80559

1バイト単位で無いとだめですか?
1文字単位なら、
    If LenB(StrConv(Mid$(Text1.Text, 30, 1), vbFromUnicode)) > 1 Then
        MsgBox "全角です"
    End If
LenBで1より大きければ全角!
1バイト単位なら、一度16進数に変換して判断するしか…
1バイトで1文字が表現されるのは、以下の範囲です。
&H00〜&H20、&H80:制御文字(空白やタブや改行などがここに含まれます)
&H21〜&H7Eの範囲:いわゆる英数字  (JIS X 0201 ローマ字)
&HA1〜&HDFの範囲:いわゆる半角カナ(JIS X0201 片仮名)
ここなんかが参考になると思います。
「キャラクターコード」
http://www.infonet.co.jp/ueyama/ip/binary/charcode.html


だい  URL  2003-11-26 17:41:16  No: 80560

ShiftJISの場合、
全角文字の2バイト目のコードがとりうる範囲は、
1バイトで表現可能な領域とオーバラップしているため
先頭から1バイトずつ判断していかないとうまくいきません。

たとえば、

VBレスキュ-さんの、
http://www.bcap.co.jp/hanafusa/
⇒文字列処理関係
⇒⇒文字列を指定の幅にカット(漢字分断回避) 

http://homepage2.nifty.com/Dee/
⇒VB,VBA,VBS,ACCESS情報屋  Tips 
⇒⇒VisualBasic,VBA関係
⇒⇒⇒文字列をSJIS換算のバイト数で切断出力する関数


nanashi  2003-11-26 20:04:00  No: 80561

頭から1文字ずつチェックしていって30バイト目がどうなってるかを見れば良いと思います。


ペンギン  2003-11-26 20:36:27  No: 80562

okuさん、だいさん、nanashiさん、お返事ありがとうございます。

参考にと提示していただいたHPを見たりいろいろと思考してみたのですが、やはり上手くいきません。

「頭から1文字ずつチェックしていって30バイト目がどうなってるか」
という処理をどのように記述すれば、
「文字列のXXバイト目が1バイトかどうか(半角かどうか)」
という判断ができるのでしょうか。

ここがどうしてもわかりません。


nanashi  2003-11-26 20:59:07  No: 80563

まァこんな感じであってるかなー?

    Dim sBuff$, sData As String
    Dim lCnt As Long
    
    sData = "頭から1文字ずつチェックしていaって30バイト目がどうなってるか"
    lCnt = 1
    
    Do While (lCnt < 30)
        sBuff = Left$(sData, 1)
        sData = Mid$(sData, 2)
        
        lCnt = lCnt + LenB(StrConv(sBuff, vbFromUnicode))
    Loop
    
    If lCnt = 30 Then
        sBuff = Left$(sData, 1)
        
        If LenB(StrConv(sBuff, vbFromUnicode)) = 2 Then
            Debug.Print "全角"
        Else
            Debug.Print "半角"
        End If
    Else
        Debug.Print "全角文字の2Byte目"
    End If

もっと良いやり方が分かる方、フォローお願いします。


ペンギン  2003-11-26 23:26:05  No: 80564

nanashiさん、再度のお返事ありがとうございます。

無事に判別をつけることができるようになりました。
本当にありがとうございました。


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

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






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