首页 > 试题

0xfe

更新时间:2022-11-12 22:40:43 阅读: 评论:0

中考需要准备什么-苦海无涯回头是岸


2022年11月12日发(作者:好兵帅克)

常见编码和编码头BOM

ANSI

(AmericanNationalStandardsInstitute,美国国家标准学会)

ANSI编码标准是指所有从基本ASCII码基础上发展起来的编码标准,

⽐如扩展的ASCII码(128~255占⽤)、GB2312、GBK、GB18030、BIG5等。每种编码在ANSI标准中都为⼀页,

⽐如2312页代表GB2312字符集编码

ASCII

(AmericanStandardCodeforInformationInterchange,美国信息交换标准码)码

ANSI的ASCII字符集占⼀个字节,8个位

起始占⽤:0x00-0x7f(127个字符状态),半⾓

扩充后全部占⽤:0x00-0xff(共256个字符)

==========分界线====================================

GB2312

常说的全⾓,使⽤2个字节编码,共收录了7445个字符,包括6763个汉字和682个其它符号

⼩于127的字符意义与原来相同,

当两个⼤于127的字节连在⼀起,就表⽰⼀个汉字,

前⾯的⼀个字节(⾼字节)从0xA1-0xF7,后⾯⼀个字节(低字节)从0xA1-0xFE。

GB2312的两个字节的最⾼位都是1,符合这个条件的码位只有128*128=16384个

GBK

不再要求低字节⼀定⼩于127,只要第⼀个字节⼤于127,就认为是⼀个汉字的开始,

不管后⾯的字节是否⼩于127,都要和第⼀个字节组成⼀个两字节的汉字.

GBK包含了GB2312的所有内容,同时⼜增加了近20000个新的汉⼦(包括繁体字)和符号

BG18030

就是GBK的升级版,增加了很多字符,

中⽂Windows的缺省内码还是GBK,因为GB18030相对GBK增加的字符,

普通⼈是很难⽤到的

BG18030每个字可以由1个、2个或4个字节组成

单字节:其值从0到0x7F。

双字节:第⼀个字节的值从0x81到0xFE,第⼆个字节的值从0x40到0xFE(不包括0x7F)

四字节:第⼀个字节的值从0x81到0xFE,第⼆个字节的值从0x30到0x39,第三个字节从0x81到0xFE,第四个字节从0x30到0x39。

BIG5

是⾹港、台湾繁体中⽂区的字符集编码标准。由于是各⾃独⽴完成编码标准,所以最后互相不兼容。

从ASCII、GB2312、GBK到GB18030,,这些编码⽅法是向前兼容的,即同⼀个字符在这些⽅案

中总是有相同的编码,区分中⽂编码的⽅法是⾼字节的最⾼位不为0。按照程序员的称呼,

GB2312、GBK到GB18030和BIG5都属于DBCS(double-bytecharatert,双字节字符集)

或者说MBCS(mutil-bytecharatert,多字节字符集)

在DBCS双字节字符集中,GB内码的存储格式始终是bigendian,即⾼位在前。

在读取DBCS字符流时,只要遇到⾼位为1的字节,就可以将下两个字节作为⼀个双字节编码,

⽽不⽤管低字节的⾼位是什么。

==============分界线============================================

Unicode

Unicode的学名是"UniversalMultiple-OctetCodedCharacterSet",简称为UCS。

UCS可以看作是"UnicodeCharacterSet"的缩写。

ISO(InternationalOrganizationforStandardization或InternationalStandardOrganized)国际标准化组织

废除了所有地区性编码⽅案,重新搞了⼀套可以包含地球上所有⽂化的⽂字和符号的编码⽅案。

他们称这个⽅案为UniversalMultiple-OctetCodedCharacterSet(通⽤多8位编码字符集),简称UCS

ISO直接规定必须⽤两个字节,也就是16位来统⼀表⽰所有的字符,对于ASCII⾥的那些“半⾓”字符,

UNICODE保持其原码不变,只是将其由原来的8位扩展为16位,⽽其它⽂化和语⾔的字符则全部重新统⼀编码。

由于“半⾓”英⽂符号只⽤到了低8位,所以其⾼8位永远是0,会多浪费⼀倍的空间.

由于UNICODE设计初期的局限性(并没有考虑到与现有编码的兼容性),

所以使得UNICODE与GBK(GB18030、BG2312等)在排版上完全不⼀样,

没有⼀种简单的算法可以把内容从UNICODE编码和两⼀种编码进⾏转换,这种转换必须通过查表来进⾏。

Unicode是2个字节的编码,所以也称UCS-2,如果⼏百年后地球上的字符⼜多了很多的话,ISO已经准备好了UCS-4⽅案了

也就是4个字节的编码,⽽Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容),与GB码不兼容。

例如“汉”字的Unicode编码是6C49,⽽GB码是BABA。

在⾮Unicode环境下,由于不同国家和地区采⽤的字符集不⼀致,很可能出现⽆法正常显⽰所有字符的情况。

微软公司使⽤了代码页(Codepage)转换表的技术来过渡性的部分解决这⼀问题,

即通过指定的转换表将⾮Unicode的字符编码转换为同⼀字符对应的系统内部使⽤的Unicode编码。

可以在“语⾔与区域设置”中选择⼀个代码页作为⾮Unicode编码所采⽤的默认编码⽅式,

如936为简体中⽂GBK,950为正体中⽂Big5(皆指PC上使⽤的)。在这种情况下,

⼀些⾮英语的欧洲语⾔编写的软件和⽂档很可能出现乱码。⽽将代码页设置为相应语⾔中⽂处理⼜会出现问题,

这⼀情况⽆法避免。从根本上说,完全采⽤统⼀编码才是解决之道,但⽬前尚⽆法做到这⼀点。

代码页技术现在⼴泛为各种平台所采⽤。UTF-7(的代码页是65000,UTF-8的代码页是65001。

UTF-8

任何⽂字在Unicode中都对应⼀个值,这个值称为代码点codepoint.代码点的值通常写成U+ABCD的格式

⽽⽂字和代码点之间的对应关系就是UCS-2(UniversalCharacterSetcodedin2octets)

UCS-4,即⽤四个字节表⽰代码点。

它的范围为U+00000000~U+7FFFFFFF,其中U+00000000~U+0000FFFF和UCS-2是⼀样的。

UCS-2和UCS-4只规定了代码点和⽂字之间的对应关系,并没有规定代码点在计算机中如何存储。

规定存储⽅式的称为UTF(UnicodeTransformationFormat),其中应⽤较多的就是UTF-16和UTF-8了

UTF是“UCSTransformationFormat”的缩写,

是"Unicode字符集转换格式",是"怎么样将Unicode定义的数字转换成程序数据"

UTF-8以字节为单位对Unicode进⾏的特殊编码。从Unicode到UTF-8的编码⽅式如下:

Unicode编码(16进制)║ UTF-8字节流(⼆进制)

000000-00007F ║ 0xxxxxxx

000080-0007FF ║ 110xxxxx10xxxxxx

000800-00FFFF ║ 1110xxxx10xxxxxx10xxxxxx

010000-10FFFF ║ 11110xxx10xxxxxx10xxxxxx10xxxxxx

UTF-8的特点是以字节为单位对Unicode进⾏编码,对不同范围的字符使⽤不同长度的编码。

对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最⼤长度是4个字节。

从上表可以看出,4字节模板有21个x,即可以容纳21位⼆进制数字。Unicode的最⼤码位0x10FFFF也只有21位。

例1:“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使⽤3字节模板了1110xxxx10xxxxxx10xxxxxx

将0x6C49写成⼆进制是:1001,⽤这个⽐特流依次代替模板中的x,

得到:1,即E6B189。

例2:Unicode编码0x20C30在0x010000-0x10FFFF之间,使⽤⽤4字节模板了:

11110xxx10xxxxxx10xxxxxx10xxxxxx。

将0x20C30写成21位⼆进制数字(不⾜21位就在前⾯补0):000110000,

⽤这个⽐特流依次代替模板中的x,

得到:11111000,即F0A0B0B0。

UTF-8是ASCII的⼀个超集。因为⼀个纯ASCII字符串也是⼀个合法的UTF-8字符串,所以现存的ASCII⽂本不需要转换。

为传统的扩展ASCII字符集设计的软件通常可以不经修改或很少修改就能与UTF-8⼀起使⽤。

使⽤标准的⾯向字节的排序例程对UTF-8排序将产⽣与基于Unicode代码点排序相同的结果。

(尽管这只有有限的有⽤性,因为在任何特定语⾔或⽂化下都不太可能有仍可接受的⽂字排列顺序。)

UTF-8和UTF-16都是可扩展标记语⾔⽂档的标准编码。所有其它编码都必须通过显式或⽂本声明来指定。

任何⾯向字节的字符串搜索算法都可以⽤于UTF-8的数据(只要输⼊仅由完整的UTF-8字符组成)。

但是,对于包含字符记数的正则表达式或其它结构必须⼩⼼。

UTF-16

UTF-16编码以16位⽆符号整数为单位,详见百度google

UTF-32

UTF-32编码以32位⽆符号整数为单位,详见百度google

===========分界线============================================

字节序

PowerPC系列采⽤bigendian⽅式存储数据,

⽽x86系列则采⽤littleendian⽅式存储数据,

⽐如:0x12345678双字型数据,占4个字节

低位数据----------------->⾼位数据

12345678H

低地址------------------->⾼地址

0x010x020x030x04内存中

|12|34|56|78|bigendian⽅式

|78|56|34|12|littleendian⽅式

littleendian⽅式个⼈理解:

(起始地址存放⾼位数据,左边12是低数据位放在尾部,是低数据位,不是指⼆进制中的右边的低数值位)

C/C++语⾔编写的程序⾥数据存储顺序是跟编译平台所在的CPU相关的,

⽽java是跨平台的,采⽤bigendian⽅式来存储数据

⽹络字节序也是bigendian⽅式

BOM

BOM(byte-ordermark)⽂件编码头,即字节顺序标记.

它是插⼊到以UTF-8、UTF16或UTF-32编码⽂件开头的特殊标记,

⽤来标记多字节编码⽂件的编码类型和字节顺序(big-endian或little-endian)。

⼀般⽤来识别⽂件的编码类型。

根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。

例如:

Unicode编码 ║ UTF-16LE ║ UTF-16BE ║ UTF32-LE ║ UTF32-BE

0x006C49 ║ 496C ║ 6C49 ║ 496C0000║ 00006C49

0x020C30 ║ 43D830DC║ D843DC30║ 300C0200 ║ 00020C30

Unicode标准建议⽤BOM(ByteOrderMark)来区分字节序,

即在传输字节流前,先传输被作为BOM的字符"零宽⽆中断空格"。

这个字符的编码是FEFF,⽽反过来的FFFE(UTF-16)和FFFE0000(UTF-32)在Unicode中都是未定义的码位,

不应该出现在实际传输中。

BOM编码头常见形式如下:

EFBBBF=UTF-8(可选标记,因为Unicode标准未有建议)

FEFF=UTF-16,big-endian(⼤尾字节序标记)

FFFE=UTF-16,little-endian(⼩尾字节序标记)(也是windows中的Unicode编码默认标记)

0000FEFF=UTF-32,big-endian(⼤尾字节序标记)

FFFE0000=UTF-32,little-endian(⼩尾字节序标记)

对于UTF-8来说,BOM标记的有⽆并不是必须的,是可选的,因为UTF8字节没有顺序,不需要标记.

也就是说⼀个UTF-8⽂件可能有BOM,也可能没有BOM.

微软在⾃⼰的UTF-8格式的⽂本⽂件之前加上了EFBBBF三个字节,

windows上⾯的notepad等程序就是根据这三个字节来确定⼀个⽂本⽂件是ASCII的还是UTF-8的,

然⽽这个只是微软暗⾃作的标记,其它平台上不⼀定会对UTF-8⽂本⽂件做个这样的标记。

微软的⼀些软件会做这种检测,但有些软件不做这种检测,⽽把它当作正常字符处理。(传说中的乱码问题)

再举个例⼦

说的是Notepad2这个体积⼩,启动速度快,功能强的轻量级⽂本编辑器,代码⾼亮等,完全可以替代系统记事本

以前刚⽤Notepad2的时候,经常在打开⼀个⽂本⽂件时显⽰乱码,点什么编码转换也没⽤,

⽐如维棠下载器程序⽬录下的,打开就是乱码,点击"⽂件","编码"⽅式,看到的是Unicode,

ok.先关掉,⽤16进制编辑器⽐如HexWorkShop打开后发现前2个字节是CFC2,这在GBK中的编码是

下载的"下",说明该编码不是Unicode,⽽是属于ANSI编码,

那么避免乱码就要对Notepad2设置下,点"⽂件","编码',"默认",在下拉菜单中找到ANSI936,(上⾯说过它就是GBK)

并勾上"跳过Unicode检测",好了再打开就正常显⽰中⽂了.

在"⽂件","编码',下有"UTF-8"和"UTF-8包含签名",这2个有什么区别呢?

其中"UTF-8包含签名",这⼀选项是将⽂件编码格式转换为UTF-8(包含BOM编码头),

翻译成"包含签名"就看不懂了...

我⽤Notepad2新建个⽂本,写上2个字:我a

1.先转成ANSI编码:⽤HexWorkShop打开CED261(我:CED2,a:61H)

2.转成Unicode编码:(little-endian)FFFE11626100(我:6211H,a:0061H)

3.转成Unicode编码:(big-endian)FEFF62110061

4.转成UTF-8编码:E6889161(我:E68891H,a:61H)

5.转成UTF-8编码:(带BOM)EFBBBFE6889161(就多了个EFBBBF头)

本文发布于:2022-11-12 22:40:43,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/88/7112.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:探索性研究
标签:0xfe
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图