C# 由UTF-8 BOM头引发的蝇头个问题(C#去BOM头)

在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虽然于编辑器中无出示,但是会出输出,就像多矣一个空行。

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为单薄个字节为编码单元,在分解一个UTF-16缓以前,首先要动手了解每个编码单元的配节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。倘使我们收到UTF-16配节流“594E”,那么就是“奎”依旧“乙”?

Unicode规范着援引的符号字节顺序的章程是BOM。BOM不是“比尔(Bill) Of
Material”的BOM表,而是Byte Order 马克(Mark)。BOM是一个来硌多少智慧的想法:

每当UCS编码中发出一个号称”ZERO WIDTH NO-BREAK
SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是无有的字符,所以不应出现于骨子里传输中。UCS规范提议我们以传输字节约流前,先招输字符”ZERO
WIDTH NO-BREAK SPACE”。

然如若接收者收到FEFF,就标明是字节流是Big-Endian的;如若接受FFFE,就标志这些字节流是Little-Endian的。由此字符”ZERO
WIDTH NO-BREAK SPACE”又受称作BOM。

UTF-8不待BOM来讲明字节顺序,但能够用BOM来表明编码模式。字符”ZERO WIDTH
NO-BREAK 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>

————————————————————————————————————————————————————————

————————————————————————————————————————————————————————

 

出于UTF8中的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 UTF8Encoding(false) 忽略BOM头为是好的。

 

 

 

相关文章