文字化けの判定


kako  2011-05-11 12:50:42  No: 102896

テキストデータを指定バイト数分切り取った場合、文字を半分にしてしまうことがあります。
その判定をしたいです。

たとえば、次のような場合です。

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が考えられます。

よろしくお願いします。


魔界の仮面弁士  2011-05-11 19:12:28  No: 102897

> 実行環境は、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 演算子で連結しましょう。


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

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






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