utf8国语编码范围,BOM头引发的五个难题

在C#中,当使用带有BOM头的UTF-8编码的字符串时,必定要稳重。

UTF-8有一点类似于Haffman编码,它将Unicode编码为:

1)假诺该字符串用作路线,用来寻址。一定会出错。
2)转变格式时,也很轻便失误。举个例子字符串转int就必将会出错。

00000000-0000007F的字符,用单个字节来代表;

 

00000080-000007FF的字符用多个字节表示 (中文的编码范围)

待续…

00000800-0000FFFF的字符用3字节表示

 

编码调换:iconv -f “文件最近编码” -t “文件调换后的编码” -o
“转变后生成的新文件名” “源文件名”temp = Iconv.conv(“UTF-8″,“gb2312″,a)

 

因为眼前截止Unicode-16标准未有一点名FFFF以上的字符,所以UTF-8最多是运用3个字节来代表一个字符。但理论上的话,UTF-8最多必要用6字节代表八个字符。

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

在UTF-8里,俄文字符依旧跟ASCII编码一样,因而原先的函数库能够延续行使。而汉语的编码范围是在0080-07FF之间,由此是2个字节表示(但那七个字节和GB编码的五个字节是不相同的)。

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

0、big endian和little endian

 

big endian和little

什么是BOM?

endian是CPU管理多字节数的例外方法。举个例子“汉”字的Unicode编码是6C49。那么写到文件里时,终究是将6C写在后面,照旧将49写在前面?要是将6C写在前头,便是big

BOM: Byte Order Mark

endian。照旧将49写在前面,便是little endian。

UTF-8 BOM又叫UTF-8 签名,其实UTF-8
的BOM对UFT-8未有效果,是为了扶助UTF-16,UTF-32才增加的

“endian”这么些词出自《格列佛游记》。小人国的国内战斗就来自吃鸡蛋时是毕竟从大洋(Big-Endian)敲开照旧从小头(Little-Endian)敲开,由此曾产生过肆次叛乱,其中三个太岁送了命,另贰个丢了皇位。

BOM,BOM签字的野趣正是告诉编辑器当前文件选择何种编码,方便编辑器度和胆识别,但是BOM纵然在编辑器中不显得,不过会发出输出,就像多了贰个空行。

大家日常将endian翻译成“字节序”,将big endian和little

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

endian称作“大尾”和“小尾”。

Byte-order mark Description

4、UTF编码

EF BB BF UTF-8

UTF-8正是以8位为单元对UCS实行编码。从UCS-2到UTF-8的编码格局如下:

FF FE UTF-16 aka UCS-2, little endian

UCS-2编码(16进制) UTF-8 字节流(二进制)

FE FF UTF-16 aka UCS-2, big endian

0000 – 007F 0xxxxxxx

00 00 FF FE UTF-32 aka UCS-4, little endian.

0080 – 07FF 110xxxxx 10xxxxxx

00 00 FE FF UTF-32 aka UCS-4, big-endian.

0800 – FFFF 1110xxxx 10xxxxxx 10xxxxxx

UTF的字节序和BOM

比方“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以料定要用3字节模板了:1110xxxx

葡京手机登陆网址,UTF-8以字节为编码单元,未有字节序的标题。UTF-16以多个字节为编码单元,在讲明二个UTF-16文本前,首先要弄了然每一种编码单元的字节序。比如收到两个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。假如大家摄取UTF-16字节流“594E”,那么那是“奎”依旧“乙”?

10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001,

Unicode标准中推荐介绍的号子字节顺序的办法是BOM。BOM不是“Bill Of
Material”的BOM表,而是Byte Order 马克。BOM是三个有一些小智慧的主张:

用那一个比特流依次代替模板中的x,获得:11100110 101一千1 10001001,即E6 B1
89。

在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-16以十六位为单元对UCS实行编码。对于小于0×一千0的UCS码,UTF-16编码就等于UCS码对应的13人无符号整数。对于非常大于
0×10000的UCS码,定义了二个算法。不过出于实在利用的UCS2,或然UCS4的BMP必然小于0×一千0,所以就近来来说,能够感觉UTF-16和UCS-2基本同样。但UCS-2只是五个编码方案,UTF-16却要用以实际的传导,所以就只能考虑字节序的主题素材。

UTF-8不须求BOM来注明字节顺序,但足以用BOM来表明编码方式。字符”ZERO WIDTH
NO-BREAK SPACE”的UTF-8编码是EF BB BF。所以一旦接收者收到以EF BB
BF最早的字节流,就知晓那是UTF-8编码了。

5、UTF的字节序和BOM

Windows正是运用BOM来标志文本文件的编码格局的。

UTF-8以字节为编码单元,未有字节序的题材。UTF-16以多个字节为编码单元,在说贝拉米(Bellamy)个UTF-16文本前,首先要弄了解每一个编码单元的字节序。
举个例子接受二个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。假诺我们接收UTF-16字节流“594E”,那么那是“奎
”依然“乙”?

原本BOM是在文书的启幕加了多少个字节作为标记。有了这一个符号,一些说道和连串能力辨识。

Unicode标准中引入的标识字节顺序的法子是BOM。BOM不是“Bill Of

 

Material”的BOM表,而是Byte Order 马克。BOM是一个有一点点小智慧的主张:

源文档
<http://www.cnblogs.com/DDark/archive/2011/11/28/2266085.html>

在UCS编码中有一个称为”ZERO WIDTH NO-BREAK

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

SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不设有的字符,所以不该出现在实际上传输中。UCS标准提议大家在传输字节流前,先传输字符”ZERO

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

WIDTH NO-BREAK SPACE”。

 

这么一旦接收者收到FEFF,就申明这么些字节流是Big-Endian的;假使收到FFFE,就标记那一个字节流是Little-Endian的。因而字符”ZERO

是因为UTF第88中学的BOM头是开玩笑的,又由于其BOM头会对数据变成影响,所以去BOM头显得十二分须求。
上面包车型客车议程能够直接对内存中的字节数组实行操作,忽略BOM头将其转string类型。

WIDTH NO-BREAK SPACE”又被称作BOM。

  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);
        }

UTF-8不须要BOM来表明字节顺序,但能够用BOM来申明编码格局。字符”ZERO

自然在读取文件时,利用 new UTF8Encoding(false) 忽略BOM头也是能够的。

WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB

 

BF(读者能够用大家前边介绍的编码方法验证一下)。所以只要接收者收到以EF
BB

 

BF伊始的字节流,就了解那是UTF-8编码了。

 

Windows就是行使BOM来标志文本文件的编码情势的。