BOM utf 8符号化判定なし


BOM(Byte Order Mark)は、UNICODテキストのUTF-16、UTF-32の符号化バイト順(高バイト低バイト順)および符号化方式(UTF-8、UTF-16、UTF-32、UTF-8符号化はバイト順に関係なく)を示す文字である.
Encoding Representation UTF-8 EF BB BF UTF-16 Big Endian FE FF UTF-16 Little Endian FF FE UTF-32 Big Endian 00 FE FF UTF-32 Little Endian FF FE 00
いくつかutf 8コードはこのBOMがなくて、どのように区別するべきで、utf 8ですかそれともansi(根本的にBOMのこのものがありません)で、以下は先にutf 8を理解します
UTF-8は、1992年にKen Thompsonによって作成されたUNICODの変長文字符号化である.現在、RFC 3629に標準化されている.UTF-8は、UNICOD文字を1~6バイトで符号化する.UNICode文字が2バイトで表される場合、UTF-8に符号化するには3バイトが必要となり、UNICode文字が4バイトで表される場合、UTF-8に符号化するには6バイトが必要となる場合がある.UNICode文字を4バイトまたは6バイトで符号化するのは多すぎるかもしれませんが、そのようなUNICode文字に遭遇することはめったにありません.
UFT-8変換表は以下の通りである.
UNICODE UTF-8 00000000 - 0000007F 0xxxxxxx 00000080 - 000007FF 110xxxxx 10xxxxxx 00000800 - 0000FFFF 1110xxxx 10xxxxxx 10xxxxxx 00010000 - 001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 00200000 - 03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 04000000 - 7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
実際にASCII文字を表すUNICode文字は、1バイトに符号化され、UTF-8はASCII文字と同じであることを示す.他のすべてのUNCODE文字をUTF-8に変換するには、少なくとも2バイトが必要です.
以上はネット上で探すutf 8の符号化の紹介で、この変換表に対して1つのテンプレートと見なすことができて、表示のバイナリビットの値で固定することに対して、XXビットは文字をunicodeで符号化して、それから値の大きさのセグメントによって、どのテンプレートを使うかを決定して、高位は前の順序でXXビットに記入します.asciiは1バイトを占有し、一般的に私たちが見ている他の文字は3バイトを占有し、00000800-0000 FFFFFF 1110 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
VB.Netコードは以下の通りです.
 
    Function OnUtf8(ByVal byts() As Byte) As Boolean
        Try
            Dim i As Int32, AscN As Int32
            Do While i <= UBound(byts)
                If byts(i) < 128 Then
                    i += 1       'ascii 
                    AscN += 1
                ElseIf (byts(i) And &HE0) = &HC0 And (byts(i + 1) And &HC0) = &H80 Then
                    i += 2      '2 utf8
                ElseIf (byts(i) And &HF0) = &HE0 And (byts(i + 1) And &HC0) = &H80 And (byts(i + 2) And &HC0) = &H80 Then
                    i += 3       '3 utf8
                Else
                    Return False
                End If
            Loop

' , ascii , 
            If AscN = byts.Length Then
                Return False
            Else
                Return True
            End If
        Catch ex As Exception
            'MsgBox(ex.Message)
        End Try
    End Function

 
 
このような判断法は、一般的な文字でも正確に判断できるが、特殊なものに触れると文字化けになり、比較的一般的な「連通」の2文字や、「戟半丁」「戟広発」など、このような組み合わせがちょうどこの判断に落ちると本来のansiコードをutf 8と認識して文字化けになり、システムが持参した手帳用の判断法はこれと差が少ないはずで、以上の特殊な文字に対してansiコードで保存すると、再び開くのは同じ文字化けして、なぜBOMのないutf 8を符号化するのか、このような状況は珍しいが.