テキストデータを指定バイト数分切り取った場合、文字を半分にしてしまうことがあります。
その判定をしたいです。
たとえば、次のような場合です。
debug.print StrConv(LeftB(StrConv("あいう1えお", vbFromUnicode),10), vbUnicode)
そこで、最後の一文字を取得して判定しようと考え、関数を作ってみました。
Private Sub ChkMoji(moji As String)
Dim bytCode() As Byte
Dim i As Integer
Dim strChar As String
strChar = StrConv(moji, vbNarrow + vbUpperCase + vbHiragana)
Select Case AscW(strChar)
Case &H21 To &H7E
Debug.Print "アスキー"
Case &H3042 To &H3093
Debug.Print "ひらがな"
Case Else
bytCode = StrConv(strChar, vbFromUnicode)
If bytCode(0) >= &H88 And bytCode(0) < &H98 Then
Debug.Print "第一水準"
ElseIf bytCode(0) = &H98 And bytCode(1) <= &H72 Then
Debug.Print "第一水準"
ElseIf bytCode(0) >= &H98 And bytCode(0) < &HFC Then
Debug.Print "第二水準"
ElseIf bytCode(0) = &HFC And bytCode(1) <= &H4B Then
Debug.Print "第二水準"
End If
End Select
End Sub
でもこれでは不十分で、全角の記号が判定できません。
全角の記号を判定する方法を教えてもらえないでしょうか?
テキストデータには何でも入るようにしています。
(制限は何もありません)
開発環境は、vb6のSP6でwin7です。
実行環境は、win98〜win7が考えられます。
よろしくお願いします。
> 実行環境は、win98〜win7が考えられます。
一部の文字においては、vbWide / vbNarrow 変換や、vbFromUnicode / vbUnicode 変換が
OS によって異なる動作をするケースがありえますのでご注意を。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200908/09080033.txt
http://support.microsoft.com/kb/170559/ja
> テキストデータには何でも入るようにしています。
そのテキストデータとは、以下の (1) という認識で合っていますか?
それとも、何でも入るという事は (2) なのでしょうか?
---------------
(1) String 変数。中身は VB 標準の Unicode 文字列形式だが、
中身は Shift_JIS 相当のデータしか含まれていない。
(2) String 変数。中身は VB 標準の Unicode 文字列形式であり、
Shift_JIS で表現できない Unicode 文字も含まれる可能性がある。
(3) String 変数。中身は Shift_JIS でエンコードされたバイナリ。
(4) UTF-16 テキストファイル、もしくは UTF-16 バイナリ。
(5) Shift_JIS テキストファイル、もしくは Shift_JIS バイナリ。
(6) 任意のバイナリ。Shift_JIS や Unicode の文字列として
デコードできないデータも含まれる可能性がある。
(7) 上記以外。(UTF-8 の場合など)
---------------
> たとえば、次のような場合です。
> debug.print StrConv(LeftB(StrConv("あいう1えお", vbFromUnicode),10), vbUnicode)
vbFromUnicode と LeftB で切り出しておられるのですね。
vbFromUnicode での変換では、Shift_JIS で表現できない文字が含まれていると
vbUnicode で復元できません。今回は、テキストデータの内容を
制限していないとのことですが、Shift_JIS に無い文字が渡された場合、
その文字はどのように扱いたいのでしょうか?
> そこで、最後の一文字を取得して判定しようと考え、関数を作ってみました。
最後の文字だけを判定しても、あまり意味がありません。
UTF-8 や UTF-16 とは異なり、Shift_JIS データという物は、
その仕様上、文字列の途中からでは分断判定を行う事ができません。
正確に切り出すためには、先頭から一文字ずつ判定する必要があります。
具体例を挙げてみると、
Chr(&H8181) は「=」の文字
Chr(&H8182) は「≠」の文字
Chr(&H8281) は「a」の文字
Chr(&H8282) は「b」の文字
あたりが分かりやすいかと思います。
これでは、切り出したバイナリの末尾が &H81 や &H82 だとしても、
それが分断されているかどうかは分かりませんよね。
10 年以上前のコードですが、一応紹介しておきます。
http://hanatyan.sakura.ne.jp/patio/read.cgi?no=229
> strChar = StrConv(moji, vbNarrow + vbUpperCase + vbHiragana)
第二引数の指定は、
strChar = StrConv(moji, vbNarrow Or vbUpperCase Or vbHiragana)
とすべきです。ビットフラグは、+ 演算子ではなく Or 演算子で連結しましょう。