C#UTF-8 BOMヘッダによる2つの問題(C#去BOMヘッダ)

4862 ワード

C#では、BOMヘッダ付きUTF-8符号化文字列を使用する場合は、注意が必要です.
1)文字列がパスとして使用される場合は、アドレス指定に使用されます.間違いに違いない.2)フォーマットを変換しても、エラーが発生しやすい.たとえば文字列がintを回転すると必ずエラーが発生します.
 
続行...
 
 
————————————————————————————————————————————————
———————————————————————————————————————————————— 
 
BOMって何?
BOM: Byte Order Mark
UTF-8 BOMはUTF-8署名とも呼ばれていますが、実はUTF-8のBOMはUFT-8には役に立たず、UTF-16、UTF-32をサポートするために付けられたものです
BOM、BOM署名とは、エディタの現在のファイルがどのような符号化を採用しているかを教え、エディタの識別を容易にすることを意味しますが、BOMはエディタに表示されませんが、空の行が1つ増えたように出力されます.
Byte Order Marks are special characters at the beginning of a Unicode file to indicate whether it is big or little endian, in other words does the high or low order byte come first. These codes also tell whether the encoding is 8, 16 or 32 bit. You can recognise Unicode files by their starting byte order marks, and by the way Unicode-16 files are half zeroes and Unicode-32 files are three-quarters zeros. Unicode Endian Markers
Byte-order mark Description
EF BB BF UTF-8
FF FE UTF-16 aka UCS-2, little endian
FE FF UTF-16 aka UCS-2, big endian
00 00 FF FE UTF-32 aka UCS-4, little endian.
00 00 FE FF UTF-32 aka UCS-4, big-endian.
UTFのバイト順とBOM
UTF-8はバイトを符号化ユニットとし、バイト順の問題はない.UTF-16は2バイトを符号化手段とし、1つのUTF-16テキストを解釈する前に、まず各符号化手段のバイト順を明らかにする.例えば、「奎」を受け取ったUnicode符号化は594 Eであり、「乙」のUnicode符号化は4 E 59である.UTF-16バイトストリーム「594 E」を受信した場合、これは「奎」ですか、それとも「乙」ですか.
Unicode仕様で推奨されるタグバイト順の方法はBOMである.BOMは「Bill Of Material」のBOMテーブルではなく、Byte Order Markです.BOMは少し頭のいい考えです.
UCS符号化には「ZERO WIDTH NO-BLEAK SPACE」という文字があり、その符号化はFEFFである.一方,FFFEはUCSには存在しない文字であるため,実際の伝送に現れるべきではない.UCS仕様では、バイトストリームを転送する前に、「ZERO WIDTH NO-BRAK SPACE」という文字を転送することを推奨しています.
このように受信者がFEFFを受信すると、このバイトストリームはBig−Endianであることを示す.FFFEが受信されると、このバイトストリームはLittle−Endianであることが示される.したがって「ZERO WIDTH NO-BRAK SPACE」はBOMとも呼ばれる.
UTF−8はバイト順を示すためにBOMを必要としないが、符号化方式をBOMで示すことができる.文字「ZERO WIDTH NO-BRAK SPACE」のUTF-8符号化はEF BB BFである.したがって,受信者がEF BB BFで始まるバイトストリームを受信すると,これがUTF−8符号化であることが分かる.
WindowsはBOMを使ってテキストファイルをマークする符号化方式です.
元々BOMはファイルの先頭に数バイトをタグとして付けていた.このマークがあれば、いくつかのプロトコルとシステムが識別できます.
 
ソースドキュメント<http://www.cnblogs.com/DDark/archive/2011/11/28/2266085.html>
————————————————————————————————————————————————————————
————————————————————————————————————————————————————————
 
UTF 8のBOMヘッダはあってもなくてもよいし、そのBOMヘッダがデータに影響を与えるため、BOMヘッダを除去する必要がある.次の方法では、BOMヘッダを無視してメモリ内のバイト配列を直接操作してstringタイプに変換できます.
  public static string GetUTF8String(byte[] buffer)

        {

            if (buffer == null)

                return null;



            if (buffer.Length <= 3)

            {

                return Encoding.UTF8.GetString(buffer);

            }



            byte[] bomBuffer = new byte[] { 0xef, 0xbb, 0xbf };



            if (buffer[0] == bomBuffer[0]

                && buffer[1] == bomBuffer[1]

                && buffer[2] == bomBuffer[2])

            {

                return new UTF8Encoding(false).GetString(buffer, 3, buffer.Length - 3);

            }



            return Encoding.UTF8.GetString(buffer);

        }

もちろん、ファイルを読み込むときは、new UTF 8 Encoding(false)を利用してBOMヘッダを無視してもよい.