精华内容
下载资源
问答
  • 聚集了各种编码工具,不知道数据是什么编码格式不要紧,只要录入,解码,各种解码数据应有尽有
  • 常见各种编码格式

    千次阅读 2019-10-07 14:00:43
    一.ANSI 这里,我将ANSI作为一个大项。...不过这样说也不准确,根据我查阅的资料来看,ASCII是早于ANSI的,所以只能说ANSI是兼容ASCII的,而不能说ASCII是根据ANSI编码所得。 ASCII,他的全称为American S...

    一.ANSI

    1. 这里,我将ANSI作为一个大项。根据我自己的理解,ANSI并不是一种具体的编码,而是一种字符代码。比如:ASCII、GB2312、GBK、GB18030等都属于ANSI的范畴。不过这样说也不准确,根据我查阅的资料来看,ASCII是早于ANSI的,所以只能说ANSI是兼容ASCII的,而不能说ASCII是根据ANSI编码所得。

    2. ASCII,他的全称为American Standard Code for Information Interchange,美国信息交换标准代码。要知道,一个字节为8位,而8位最多可以组合256种不同的状态,用来保存英文、数字、符号完全够用了,而事实上,ASCII只用了前128个字符。但是后来除了美国,其他的一些国家也使用了计算机,但是他们的文字并非都是这些字母,所以又使用了后面的128位,又叫:”扩展字符集“。

    3. MBCS:就目前我查阅的资料来看,MBCS是一种统称,许多汉字的编码都属于MBCS,比如GB2312、GBK、GB18030等。因为无论ASCII编码如何扩展,也满足不了中文,中文的字数太庞大了。MBCS支持中英文混用,英文的话就和ASCII一样,中文的话就占2个字节,GB2312的字数最少,其规定必须2个字节都大于127才表示一个汉字;其次是GBK,其规定只要第一个字节大于127就可以了;最后是GB18030,具体编码不清楚,好像不止2个字节,但应该是兼容GBK的,字数比前面2个要多的多。

    4. 现在,再来看ANSI,叫美国国家标准协会,顾名思义是用来定义世界编码方式的,不像ASCII,当初创建的时候只是想给美国人自己用而已。ANSI的规则是,ASCII不能动,也就是说所有的ANSI标准都是兼容英文的,比如中文的GBK编码就可以实现中文和英文混用。但是,每个国家自己的文字编码就各不相同了,比如中文的ANSI编码和日本的ANSI编码就完全不同,所以无法实现中文和日文的混用。另外,只要你的编码被ANSI认可,以后世界上任何地方只要使用中文,就必须用中国的这一套编码方案。

    二.Unicode

    1. 根据网上查询的资料来看,有的说Unicode是一种符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储,并不是一种编码方式。但是我们常用的TXT文档中,明显就有一种Unicode编码格式,这是为什么呢?

    2. 从我目前查阅的资料来看,Unicode确实是一种符号集,可以简写为UCS(Unicode Character Set)。但是,Unicode也是有他自己的编码格式的,比如UCS-2就是用两个字节编码、UCS-4用4个字节编码。那么,TXT文档中的Unicode是什么呢?其实就是UCS-2,并且是小端模式。

      当然,以上都是我查阅资料所获取的,如果不对,麻烦告知。

    3. 所以,Unicode将全世界所有的文字等都进行了统一的编码,这样就不会有ANSI的兼容问题。

    4. 但是Unicode一直得不到推广。因为英文只占一个字节,但是在Unicode却要占2个字节,有很大的浪费;另外,又如何去区分Unicode和ANSII呢,计算机如何知道3个字节到底是一个字符,还是3个字符呢?

    5. 直到互联网的出现,推动了Unicode的推广。因为,互联网拉近了人和人之间的距离。那么如果用ANSI的话,编码格式太乱了。而UTF标准就出现了,其中UTF-8就是在互联网上使用最广的一种unicode的实现方式,因为他是变长的,所以极大的节省了空间,这种为传输而出现的编码格式,使得全世界的编码方式统一,非常的便利。

      这里记录下:java是双字节编码,采用的是UTF-16BE,中文占2个字节,英文占2个字节

    三.URL编码

    1. url编码是一种浏览器用来打包表单输入的格式,其基本格式为"key=value"这种键值对的,如果要传多个参数就需要用“&”符号对键值对进行分割。

    2. URL编码其实使用的是ascii码的16进制,所以,URL中只能有英文、数字还有一些特殊字符。

    3. 那我们在访问网址的时候,有时候确实后面的参数有中文。这时候,就使用了encode编码,将中文写成%XX的格式,然后再通过decode还原成中文。当然,不仅仅是中文,许多字符等都是这样操作的。具体的可以自行百度。

    4. 那么这些中文,是使用的什么编码方式转变为%xxx的形式呢?肯定不是ASCII,因为他压根不认识中文。从我网上查询的资料来看,貌似UTF-8占多数,但好像也有GB2312这种编码方式。

    四.一个经典的问题:TXT显示联通乱码

    1. 新建一个文本文档,在里面输入“联通”2个字。

      各种编码格式介绍

    2. 然后关闭文档,重新打开,发现变成乱码了

      各种编码格式介绍

    3. 这是为什么呢?我们再写一个TXT文档,写入你好,重新打开文档后,发现是可以正确显示的,我们看一下他的编码方式。通过“另存为”,可以发现编码方式为ANSI

      各种编码格式介绍

    4. 在看一下刚才写的联通,发现编码方式为UTF-8,此时隐约可以知道,应该是编码导致的。

      各种编码格式介绍

    5. 这里说一个概念:首先,计算机只认识0和1,所以任何字符等在计算机里,都是以二进制的形式存储的,也就是字节的形式存储。那么,当计算机中的字节序列是以某种编码格式存放的,想要将这些字节序列重新变成人所认识的字符串,也需要使用这种编码格式,否则会出现乱码。

    6. 那么,刚才那个TXT文本,其实就是文本文件。文本文件在计算机中存储的就是字节序列。如果我们直接在中文的电脑上创建一个文本文件,那么这个文本文件只认识ANSI编码,(这句话并不是指文本文件只认识ANSI编码,其实你可以将各种的编码格式的字节存放进去,但在中文机器上直接创建,就有其特殊性)。而联通这两个字巧了,刚好符合UTF-8的编码格式,所以就当做UTF-8存储了,但重新将字节转换为字符串的时候,是以ANSI格式转换的,肯定是乱码。

    7. 现在,你再试一下,在联通的后面加入任意的字,比如联通哈哈。那么,哈哈2个字和UTF-8的编码格式不一样的,所以仍然会作为ANSI格式存储,就不会有问题了。

      各种编码格式介绍

    展开全文
  • 各种编码格式的比较

    千次阅读 2015-12-31 10:46:51
    各种编码格式都可以对中文进行处理,GB2312和GBK编码规则类似,差别在于GBK存储汉字的范围更大一些,可以处理几乎全部的汉字,所以用GB2312编码的,完全可以用GBK去解码,完美解码。从这一点上看GBK兼容GB2312。所以...

    各种编码格式都可以对中文进行处理,GB2312和GBK编码规则类似,差别在于GBK存储汉字的范围更大一些,可以处理几乎全部的汉字,所以用GB2312编码的,完全可以用GBK去解码,完美解码。从这一点上看GBK兼容GB2312。所以GB2312和GBK选择,我选择GBK。UTF-16与UTF-8都是处理unicode编码,他们的编码规则不太相同,相对来说前者的编码效率高。字符到字节的转化规则更简单,进行字符串操作更好。它适合本地磁盘和内存之间的使用,可以进行字符和字节之间的快速切换,如java的内存编码就是采用UTF-16的编码,但是它不适合在网络之间传输,因为网络传输容易丢失字节流,一旦字节流损坏就很难恢复了,相对而言UTF-8更加适合网络传输,对ASCII字符采用单字节存储,而不像UTF-16高位补零规则。另外单个字符损坏也不会影响后面的其他字符。因为UTF-8有对单字节的校验。在编码效率上处于GBK和UTF-16之间。

    下面详细介绍一下各种编码的基础知识:

    1、字符集与字符编码

    字符是各种文字和符号的总称,包括各个国家文字、标点符号、图形符号、数字等。字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集有:ASCII字符集、ISO 8859字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。 

     

    编码(encoding)和字符集不同。字符集只是字符的集合,不一定适合作网络传送、处理,有时须经编码(encode)后才能应用。如Unicode可依不同需要以UTF-8、UTF-16、UTF-32等方式编码。

     

    字符编码就是以二进制的数字来对应字符集的字符。

     

    因此,对字符进行编码,是信息交流的技术基础。

     

    使用哪些字符。也就是说哪些汉字,字母和符号会被收入标准中。所包含“字符”的集合就叫做“字符集”。

    规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。

     

    各个国家和地区在制定编码标准的时候,“字符的集合”和“编码”一般都是同时制定的。因此,平常我们所说的“字符集”,比如:GB2312, GBK, JIS 等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义。

     

    注意:Unicode字符集有多种编码方式,如UTF-8、UTF-16等;ASCII只有一种;大多数MBCS(包括GB2312)也只有一种。

    2、什么是内码?

    2.1 维基百科的解释

     

    在计算机科学及相关领域当中,内码指的是“将资讯编码后,透过某种方式储存在特定记忆装置时,装置内部的编码形式”。在不同的系统中,会有不同的内码。

    在以往的英文系统中,内码为ASCII。在繁体中文系统中,目前常用的内码为大五码(Big5)。在简体中文系统中,内码则为国标码(国家标准代码:现在强制要求使用GB18030标准;较旧计算机仍然使用GB2312)。而统一码(Unicode)则为另一常见内码。

     

    2.2 百度百科的解释

     

    内码是指整机系统中使用的二进制字符编码,是沟通输入、输出与系统平台之间的交换码,通过内码可以达到通用和高效率传输文本的目的。比如MS Word中所存储和调用的就是内码而非图形文字。英文ASCII字符采用一个字节的内码表示,中文字符如国标字符集中,GB2312、GB12345、GB13000皆用双字节内码,GB18030(27,533汉字)双字节内码汉字为20,902个,其余6,631个汉字用四字节内码。

    3、字符编码分类总结

    下面从计算机对多国语言支持的角度来总结字符编码。

     

    3.1 ASCII编码

     

    以下来自“维基百科”:

    ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语,而其扩展版本EASCII则可以勉强显示其他西欧语言。它是现今最通用的单字节编码系统(但是有被UniCode追上的迹象),并等同于国际标准ISO/IEC 646。

    ASCII第一次以规范标准的型态发表是在1967年,最后一次更新则是在1986年,至今为止共定义了128个字符;其中33个字符无法显示(这是以现今操作系统为依归,但在DOS模式下可显示出一些诸如笑脸、扑克牌花式等8-bit符号),且这33个字符多数都已是陈废的控制字符。控制字符的用途主要是用来操控已经处理过的文字。在33个字符之外的是95个可显示的字符,包含用键盘敲下空白键所产生的空白字符也算1个可显示字符(显示为空白)。

    ASCII表:见http://zh.wikipedia.org/zh-cn/ASCII

     

    ASCII缺点:

    ASCII的最大缺点是只能显示26个基本拉丁字母、阿拉伯数目字和英式标点符号,因此只能用于显示现代美国英语(而且在处理英语当中的外来词如naïve、café、élite等等时,所有重音符号都不得不去掉,即使这样做会违反拼写规则)。而EASCII虽然解决了部份西欧语言的显示问题,但对更多其他语言依然无能为力。因此现在的苹果电脑已经抛弃ASCII而转用Unicode。

     

    最早的英文DOS操作系统的系统内码是:ASCII。计算机这时候只支持英语,其他语言不能够在计算机存储和显示。

     

    在该阶段,单字节字符串使用一个字节存放一个字符(SBCS,Single Byte Character System)。如:"Bob123"占6个字节。

     

    3.2 ANSI编码

     

    为使计算机支持更多语言,通常使用0x800~xFF范围的2个字节来表示1个字符。比如:汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0]这两个字节存储。

     

    不同的国家和地区制定了不同的标准,由此产生了GB2312,BIG5,JIS等各自的编码标准。这些使用2个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。

     

    不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。

     

    中文DOS、中文/日文Windows 95/98时代系统内码使用的是ANSI编码(本地化)

     

    在使用ANSI编码支持多语言阶段,每个字符使用一个字节或多个字节来表示(MBCS,Multi-Byte Character System),因此,这种方式存放的字符也被称作多字节字符。比如,"中文123" 在中文 Windows 95 内存中为7个字节,每个汉字占2个字节,每个英文和数字字符占1个字节。

     

    在非 Unicode 环境下,由于不同国家和地区采用的字符集不一致,很可能出现无法正常显示所有字符的情况。微软公司使用了代码页(Codepage)转换表的技术来过渡性的部分解决这一问题,即通过指定的转换表将非 Unicode 的字符编码转换为同一字符对应的系统内部使用的 Unicode 编码。可以在“语言与区域设置”中选择一个代码页作为非 Unicode 编码所采用的默认编码方式,如936为简体中文GBK,950为正体中文Big5(皆指PC上使用的)。在这种情况下,一些非英语的欧洲语言编写的软件和文档很可能出现乱码。而将代码页设置为相应语言中文处理又会出现问题,这一情况无法避免。从根本上说,完全采用统一编码才是解决之道,但目前尚无法做到这一点。

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

     

    3.3 Unicode编码

     

    为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。

     

    Unicode字符集可以简写为UCS(Unicode Character Set)。早期的unicodeUnicode标准有UCS-2、UCS-4的说法。UCS-2用两个字节编码,UCS-4用4个字节编码。

     

    在 UNICODE 被采用之后,计算机存放字符串时,改为存放每个字符在 UNICODE 字符集中的序号。目前计算机一般使用 2 个字节(16 位)来存放一个序号(DBCS,Double Byte Character System),因此,这种方式存放的字符也被称作宽字节字符。比如,字符串 "中文123" 在 Windows 2000 下,内存中实际存放的是 5 个序号,一共10个字节。

     

    Unicode字符集包含了各种语言中使用到的所有“字符”。用来给 UNICODE 字符集编码的标准有很多种,比如:UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig 等。

    4、常用编码规则

    4.1 单字节字符编码

     

    (1)编码标准:ISO-8859-1。

    (2)说明:最简单的编码规则,每一个字节直接作为一个 UNICODE 字符。比如,[0xD6, 0xD0] 这两个字节,通过 iso-8859-1 转化为字符串时,将直接得到 [0x00D6, 0x00D0] 两个 UNICODE 字符,即 "ÖÐ"。

     

    反之,将 UNICODE 字符串通过 iso-8859-1 转化为字节串时,只能正常转化 0~255 范围的字符。

     

    4.2 ANSI编码

     

    (1)GB2312, BIG5, Shift_JIS, ISO-8859-2。

    (2)把 UNICODE 字符串通过 ANSI 编码转化为“字节串”时,根据各自编码的规定,一个 UNICODE 字符可能转化成一个字节或多个字节。

     

    反之,将字节串转化成字符串时,也可能多个字节转化成一个字符。比如,[0xD6, 0xD0] 这两个字节,通过 GB2312 转化为字符串时,将得到 [0x4E2D] 一个字符,即 '中' 字。

     

    “ANSI 编码”的特点:

    (1)这些“ANSI 编码标准”都只能处理各自语言范围之内的 UNICODE 字符。

    (2)“UNICODE 字符”与“转换出来的字节”之间的关系是人为规定的。

     

    4.3 UNICODE编码

     

    (1)编码标准:UTF-8, UTF-16, UnicodeBig。

    (2)与“ANSI 编码”类似的,把字符串通过 UNICODE 编码转化成“字节串”时,一个 UNICODE 字符可能转化成一个字节或多个字节。

     

    与“ANSI 编码”不同的是:

    (1)这些“UNICODE 编码”能够处理所有的 UNICODE 字符。

    (2)“UNICODE 字符”与“转换出来的字节”之间是可以通过计算得到的。

     

    我们实际上没有必要去深究每一种编码具体把某一个字符编码成了哪几个字节,我们只需要知道“编码”的概念就是把“字符”转化成“字节”就可以了。对于“UNICODE 编码”,由于它们是可以通过计算得到的,因此,在特殊的场合,我们可以去了解某一种“UNICODE 编码”是怎样的规则。

    5、编码的区别

    5.1 GB2312、GBK和GB18030

     

    (1)GB2312 

     

    当中国人们得到计算机时,已经没有可以利用的字节状态来表示汉字,况且有6000多个常用汉字需要保存,于是想到把那些ASCII码中127号之后的奇异符号们直接取消掉, 规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。这种汉字方案叫做 "GB2312"。GB2312 是对 ASCII 的中文扩展。兼容ASCII。

     

    (2)GBK 

     

    但是中国的汉字太多了,我们很快就就发现有许多人的人名没有办法在这里打出来,不得不继续把 GB2312 没有用到的码位找出来用上。后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 “GBK” 标准,GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。

     

    (3)GB18030 

     

    后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK 扩成了 GB18030。从此之后,中华民族的文化就可以在计算机时代中传承了。 

     

    中国的程序员们看到这一系列汉字编码的标准是好的,于是通称他们叫做 "DBCS"(Double Byte Charecter Set 双字节字符集)。在DBCS系列标准里,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,因此他们写的程序为了支持中文处理,必须要注意字串里的每一个字节的值,如果这个值是大于127的,那么就认为一个双字节字符集里的字符出现了。在这种情况下,"一个汉字算两个英文字符!"。然而,在Unicode环境下却并非总是如此。 

     

    5.1 Unicode和BigEndianUnicode

     

    这两个指示存储顺序不同,如"A"的Unicode编码为6500,而BigEndianUnicode编码为0065。

     

    5.2 UTF-7、UTF-8和UTF-16

     

    在Unicode里,所有的字符被一视同仁。汉字不再使用“两个扩展ASCII”,而是使用“1个Unicode”,注意,现在的汉字是“一个字符”了,于是,拆字、统计字数这些问题也就自然而然的解决了。

     

    但是,这个世界不是理想的,不可能在一夜之间所有的系统都使用Unicode来处理字符,所以Unicode在诞生之日,就必须考虑一个严峻的问题:和ASCII字符集之间的不兼容问题。 

     

    我们知道,ASCII字符是单个字节的,比如“A”的ASCII是65。而Unicode是双字节的,比如“A”的Unicode是0065,这就造成了一个非常大的问题:以前处理ASCII的那套机制不能被用来处理Unicode了。

     

    另一个更加严重的问题是,C语言使用'\0'作为字符串结尾,而Unicode里恰恰有很多字符都有一个字节为0,这样一来,C语言的字符串函数将无法正常处理Unicode,除非把世界上所有用C写的程序以及他们所用的函数库全部换掉。

     

    于是,比Unicode更伟大的东东诞生了,之所以说它更伟大是因为它让Unicode不再存在于纸上,而是真实的存在于我们大家的电脑中。那就是:UTF。

     

    UTF= UCS Transformation Format,即UCS转换(传输)格式。

    它是将Unicode编码规则和计算机的实际编码对应起来的一个规则。现在流行的UTF有2种:UTF-8和UTF-16。

     

    这两种都是Unicode的编码实现。

     

    5.2.1 UTF-8

     

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

    0000 - 007F         0xxxxxxx

    0080 - 07FF         110xxxxx 10xxxxxx

    0800 - FFFF         1110xxxx 10xxxxxx 10xxxxxx 

     

    例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001,用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

     

    可见UTF-8是变长的,将Unicode编码为00000000-0000007F的字符,用单个字节来表示; 00000080-000007FF的字符用两个字节表示;00000800-0000FFFF的字符用3字节表示。因为目前为止Unicode-16规范没有指定FFFF以上的字符,所以UTF-8最多是使用3个字节来表示一个字符。但理论上来说,UTF-8最多需要用6字节表示一个字符。 

     

    UTF-8兼容ASCII。

     

    5.2.2 UTF-16(标准的Unicode成为UTF-16)

     

    UTF-16和上面提到的Unicode本身的编码规范是一致的。

     

    UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。

     

    UTF-16不兼容ASCII。

     

    5.2.3 UTF-7

     

    UTF-7 (7-位元 Unicode 转换格式(Unicode Transformation Format,简写成 UTF)) 是一种可变长度字元编码方式,用以将 Unicode 字元以 ASCII 编码的字元串来呈现,可以应用在电子邮件传输之类的应用。

     

    UTF-7并非Unicode标准之一。想要详细了解的可以查阅相关资料。

    6、Unicode与UTF

    Unicode是内存编码表示方案(是规范),而UTF是如何保存和传输Unicode的方案(是实现)。

     

    6.1 UTF的字节序和BOM

     

    6.1.1 字节序

     

    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编码了。

     

    6.1.2 BOM

     

    (1)BOM的来历 

     

    为了识别 Unicode 文件,Microsoft 建议所有的 Unicode 文件应该以 ZERO WIDTH NOBREAK SPACE(U+FEFF)字符开头。这作为一个“特征符”或“字节顺序标记(byte-order mark,BOM)”来识别文件中使用的编码和字节顺序。

     

    (2)不同的系统对BOM的支持 

     

    因为一些系统或程序不支持BOM,因此带有BOM的Unicode文件有时会带来一些问题。

     

    ①JDK1.5以及之前的Reader都不能处理带有BOM的UTF-8编码的文件,解析这种格式的xml文件时,会抛出异常:Content is not allowed in prolog。“对于解决方法,之后我会写篇文章专门讨论该问题。”

     

    ②Linux/UNIX 并没有使用 BOM,因为它会破坏现有的 ASCII 文件的语法约定。

     

    ③不同的编辑工具对BOM的处理也各不相同。使用Windows自带的记事本将文件保存为UTF-8编码的时候,记事本会自动在文件开头插入BOM(虽然BOM对UTF-8来说并不是必须的)。而其它很多编辑器用不用BOM是可以选择的。UTF-8、UTF-16都是如此。

     

    (3)BOM与XML 

     

    XML解析读取XML文档时,W3C定义了3条规则:

     

    ①如果文档中有BOM,就定义了文件编码;

    ②如果文档中没有BOM,就查看XML声明中的编码属性;

    ③如果上述两者都没有,就假定XML文档采用UTF-8编码。

     

    6.2 决定文本的字符集与编码

     

    软件通常有三种途径来决定文本的字符集和编码。

     

    (1)对于Unicode文本最标准的途径是检测文本最开头的几个字节。如:

     

    开头字节        Charset/encoding

     EF BB BF    UTF-8

     FE FF     UTF-16/UCS-2, little endian(UTF-16LE)

     FF FE     UTF-16/UCS-2, big endian(UTF-16BE)

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

     00 00 FE FF  UTF-32/UCS-4, big-endia

     

    (2)采取一种比较安全的方式来决定字符集及其编码,那就是弹出一个对话框来请示用户。

     

    然而MBCS文本(ANSI)没有这些位于开头的字符集标记,现在很多软件保存文本为Unicode时,可以选择是否保存这些位于开头的字符集标记。因此,软件不应该依赖于这种途径。这时,软件可以采取一种比较安全的方式来决定字符集及其编码,那就是弹出一个对话框来请示用户。

     

    (3)采取自己“猜”的方法。

     

    如果软件不想麻烦用户,或者它不方便向用户请示,那它只能采取自己“猜”的方法,软件可以根据整个文本的特征来猜测它可能属于哪个charset,这就很可能不准了。使用记事本打开那个“联通”文件就属于这种情况。(把原本属于ANSI编码的文件当成UTF-8处理,详细说明见:http://blog.csdn.net/omohe/archive/2007/05/29/1630186.aspx)

     

    展开全文
  • Jsp的各种编码格式

    千次阅读 2019-04-29 01:13:57
    Jsp的各种编码格式 1.<%@ page pageEncoding="UTF-8"> 看了很多的博客,比较一致的观点就是,这个编码表示jsp源文件的编码格式。 在jsp文件被翻译成java文件的时候,会默认的翻译成UTF-8的格式,所以如果...

    Jsp的各种编码格式

    1.<%@ page pageEncoding="UTF-8">

    看了很多的博客,比较一致的观点就是,这个编码表示jsp源文件的编码格式。
    在jsp文件被翻译成java文件的时候,会默认的翻译成UTF-8的格式,所以如果这里设置的编码不是UTF-8就会乱码。

    2.<%@ page contentType="... charset=GBK">

    jsp中的
    contentType="text/html; charset=GBK"
    被翻译到Java中会变成
    response.setContentType("text/html; charset=GBK");

    说明者个是服务端的一个响应格式。

    3.< meta charset="UTF-8" >

    java文件中,HTML的部分直接被写入文件中

      out.write("<head>\r\n");
      out.write("<meta charset=\"UTF-8\">\r\n");
      out.write("<title>Insert title here</title>\r\n");
    

    现在我也还是不能够特别清楚的明白这些格式的问题,所以,将所有格式统一成UTF-8

    展开全文
  • 编码转换工具,用于给各种字符集的文件自动,批量转换编码
  • /** * 封装各种格式编码解码工具类. * 1.Commons-Codec的 hex/base64 编码 * 2.自制的base62 编码 * 3.Commons-Lang的xml/html escape * 4.JDK提供的URLEncoder */
  • 主要介绍了各种格式编码解码工具类,集成Commons-Codec、Commons-Lang及JDK提供的编解码方法
  • 语音编码格式

    2014-03-26 17:17:50
    语音编码格式大全,各种编码方式的文件头,各种语音文件格式,利于各类语音编码形式
  • 封装格式AVI、VOB、WMV、...视频编码格式h264、MPEG-1 、MPEG2、MPEG4、WMV、H263、MJPEG、VP8/VP9、RealVideo;(VC-1) 音频编码格式: G.711、G722、G726、AAC、MP1/MP2/MP3、AC-3、WMA、amr_nb、amr_wb、RealAudio
  • ios各种编码格式范围深坑

    千次阅读 2017-07-26 17:32:09
    写了一个二维码,闸机读出来竟然不对,我就问你尴不尴尬?因为我二维码传的是原始的字符串,读出来之后是303232333435等,这分明是要反加密...就知道可能是加密方式错了,可是变换各种加密方式无果。整整一天发现生成二

    写了一个二维码,闸机读出来竟然不对,我就问你尴不尴尬?因为我二维码传的是原始的字符串,读出来之后是303232333435等,这分明是要反加密的节奏啊,于是utf-8反加密,当数据中每个字节全部小于80时完全正常无压力。但是当数据大于80时就加了c2 80或c3 80,c2 90 或c3 90.这就更尴尬了。找了半天没有丝毫头绪。就知道可能是加密方式错了,可是变换各种加密方式无果。整整一天发现生成二维码中使用了utf8编码。需要改成我们需要的ISO-8859-1即NSISOLatin1StringEncoding编码。它最大支持FF(255),而ACSCII最大支持127.
    下面是我搜集的编码范围,希望朋友们可以帮我补全。这些编码格式都是什么时机用到。

    NSArray *arrayEncoding = @[@(NSASCIIStringEncoding),/* 0..127 only */
                                 @(NSNEXTSTEPStringEncoding),
                                 @(NSJapaneseEUCStringEncoding),
                                 @(NSUTF8StringEncoding),/*UTF-8有点类似于Haffman编码,它将Unicode编码为00000000-0000007F的字符,用单个字节来表示;
                                        00000080-000007FF的字符用两个字节表示
                                        00000800-0000FFFF的字符用3字节表示
                                        因为目前为止Unicode-16规范没有指定FFFF以上的字符,所以UTF-8最多是使用3个字节来表示一个字符。但理论上来说,UTF-8最多需要用6字节表示一个字符*/
                                 @(NSISOLatin1StringEncoding),/*通过 iso-8859-1 转化为字符串时,将直接得到 [0x00D6, 0x00D0] 两个 UNICODE 字符,即 "ÖÐ"。反之,将 UNICODE 字符串通过 iso-8859-1 转化为字节串时,只能正常转化 0~255 范围的字符。*/
    
    @(NSSymbolStringEncoding),
                                 @(NSNonLossyASCIIStringEncoding),
                                 @(NSShiftJISStringEncoding),
                                 @(NSISOLatin2StringEncoding),
                                 @(NSUnicodeStringEncoding),/*它是一种2字节编码,能够提供65536个字符,如"A"的Unicode编码为6500,而BigEndianUnicode编码为0065*/
                                 @(NSWindowsCP1251StringEncoding),
                                 @(NSWindowsCP1252StringEncoding),
                                 @(NSWindowsCP1253StringEncoding),
                                 @(NSWindowsCP1254StringEncoding),
                                 @(NSWindowsCP1250StringEncoding),
                                 @(NSISO2022JPStringEncoding),
                                 @(NSMacOSRomanStringEncoding),
    
    @(NSUTF16StringEncoding),
                                 @(NSUTF16BigEndianStringEncoding),
                                 @(NSUTF16LittleEndianStringEncoding),
    
    @(NSUTF32StringEncoding),
                                 @(NSUTF32BigEndianStringEncoding),
                                 @(NSUTF32LittleEndianStringEncoding)
                                 ];

    另附简单的文件的编码格式分析,结果肯定是一大墩:看看就行

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
    
        NSArray *arrEncoding = @[
    
    @(NSASCIIStringEncoding),
                                 @(NSNEXTSTEPStringEncoding),
                                 @(NSJapaneseEUCStringEncoding),
    
    @(NSUTF8StringEncoding),
                                 @(NSISOLatin1StringEncoding),
    
    @(NSSymbolStringEncoding),
                                 @(NSNonLossyASCIIStringEncoding),
                                 @(NSShiftJISStringEncoding),
                                 @(NSISOLatin2StringEncoding),
                                 @(NSUnicodeStringEncoding),
                                 @(NSWindowsCP1251StringEncoding),
                                 @(NSWindowsCP1252StringEncoding),
                                 @(NSWindowsCP1253StringEncoding),
                                 @(NSWindowsCP1254StringEncoding),
                                 @(NSWindowsCP1250StringEncoding),
                                 @(NSISO2022JPStringEncoding),
                                 @(NSMacOSRomanStringEncoding),
    
    @(NSUTF16StringEncoding),
                                 @(NSUTF16BigEndianStringEncoding),
                                 @(NSUTF16LittleEndianStringEncoding),
    
    @(NSUTF32StringEncoding),
                                 @(NSUTF32BigEndianStringEncoding),
                                 @(NSUTF32LittleEndianStringEncoding)
    ];
    
        NSArray *arrEncodingName = @[
    
    @"NSASCIIStringEncoding",
                                     @"NSNEXTSTEPStringEncoding",
                                     @"NSJapaneseEUCStringEncoding",
                                     @"NSUTF8StringEncoding",
                                     @"NSISOLatin1StringEncoding",
                                     @"NSSymbolStringEncoding",
                                     @"NSNonLossyASCIIStringEncoding",
                                     @"NSShiftJISStringEncoding",
                                     @"NSISOLatin2StringEncoding",
                                     @"NSUnicodeStringEncoding",
                                     @"NSWindowsCP1251StringEncoding",
                                     @"NSWindowsCP1252StringEncoding",
                                     @"NSWindowsCP1253StringEncoding",
                                     @"NSWindowsCP1254StringEncoding",
                                     @"NSWindowsCP1250StringEncoding",
                                     @"NSISO2022JPStringEncoding",
                                     @"NSMacOSRomanStringEncoding",
                                     @"NSUTF16StringEncoding",
                                     @"NSUTF16BigEndianStringEncoding",
                                     @"NSUTF16LittleEndianStringEncoding",
                                     @"NSUTF32StringEncoding",
                                     @"NSUTF32BigEndianStringEncoding",
                                     @"NSUTF32LittleEndianStringEncoding"
    ];
    
        for (int i = 0 ; i < [arrEncoding count]; i++) {
            unsigned long encodingCode = [arrEncoding[i] unsignedLongValue];
            NSLog(@"arrEncodingName>>(%@)", arrEncodingName[i]);
            NSError *error = nil;
            NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"a" ofType:@"rtf"];
            NSString *filePath = imagePath; // <---这里是要查看的文件路径
            NSString *aString = [NSString stringWithContentsOfFile:filePath encoding:encodingCode  error:&error];
            NSLog(@"Error:>>%@", [error localizedDescription]);
            NSData *data = [aString dataUsingEncoding:encodingCode];
            NSString *string = [[NSString alloc] initWithData:data encoding:encodingCode];
            NSLog(@"[string length]>>>%d", [string length]);
    
        }
    
    }
    展开全文
  • 常见音频编码格式解析

    万次阅读 多人点赞 2017-12-15 11:22:06
    常见音频编码格式解析常见音频编码格式解析 MP3编码格式 1MP3概述 2MPEG音频压缩基础 3MPEG Layer3编解码的基本原理 4整个MP3文件结构 41ID3V2 42音频数据帧 43ID3v1 AAC编码格式 1AAC概述 2AAC扩展名 3AAC规格 4AAC...
  • 中文字符串截取(支持各种编码格式)底层实现源码
  • 利用该工具可以查看各种不同类型的编码格式,包括UNICODE、GBK、欧洲一些国家的编码格式,对于开发人员打开一个BIN文件后直接可以看到十六进制数据,非常方便!
  • 各种图片编码格式详解

    万次阅读 多人点赞 2016-09-25 09:50:09
    常见的图片格式有bmp, jpg(jpeg), png, gif, webp等。 图像基本数据结构  要讲图片格式还先得从图像的基本数据结构说起。在计算机中, 图像是由一个个像素点组成,像素点就是颜色点,而颜色最简单的方式就是用RGB...
  • 各种编码格式(非常经典)

    万次阅读 多人点赞 2017-09-06 09:11:50
    编码有几种 ,计算机最初是在美国等国家发明的 所以表示字符只有简单的几个字母只要对字母进行编码就好 我们标准码 iso-8859-1 这就是一个标准 但是后来计算机普及了 于是就中国要使用计算机了 但是机器不认得中文,...
  • 常见视频编码格式解析

    万次阅读 多人点赞 2017-12-15 14:12:56
    常见视频编码格式解析 常见视频编码格式解析 1.MPEG2-TS编码技术 1.1.MPEG-TS简介 1.2.基本概念及TS流概述 1.3.基本流程 1.4.TS流传输包(简称TS包)结构分析 1.4.1.TS包包头 1.4.2.TS包净荷部分 1.5.PS节目流 ...
  • 日常工作中,我们可能会遇到处理不同格式编码的文本文件的需求,这个问题如果处理不好,就会有中文乱码等棘手的问题。 以下这个文章写的很不错: 阮一峰:字符编码笔记:ASCII,Unicode和UTF-8 ...
  • 各种主流音视频编码格式介绍

    千次阅读 2013-12-07 11:57:58
    各种主流音频编码格式介绍   1、PCM编码  PCM 脉冲编码调制是Pulse Code Modulation的缩写。前面的文字我们提到了PCM大致的工作流程,我们不需要关心PCM最终编码采用的是什么计算方式,我们只需要知道PCM编码 的...
  • 各种视频编码器的命令行格式

    万次阅读 多人点赞 2013-09-15 12:31:56
    各种编码器命令行工具的简单使用方式 第一行是编码,第二行是解码 注意: 输入为YUV420P序列 分辨率:1920x1080P 帧率:25 HEVC: //编码器自动输出重建文件 TappEncoder -c encoder_lowdelay_P_main.cfg -i src01_...
  • 各种主流音频/视频编码格式介绍

    千次阅读 2013-10-23 18:08:13
    各种主流音频编码格式介绍   1、PCM编码  PCM 脉冲编码调制是Pulse Code Modulation的缩写。前面的文字我们提到了PCM大致的工作流程,我们不需要关心PCM最终编码采用的是什么计算方式,我们只需要知道PCM编码 ...
  • Eclipse之文件【默认编码格式设置】,防止乱码等问题 文件默认编码格式设置步骤
  • 字符编码(Character Encoding)是一套法则,使用该法则能够对自然语言的字符的一个字符集(如字母表或音节表),与计算机能识别的二进制数字进行配对。为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符...
  • c#中各种编码格式的区别

    千次阅读 2012-09-06 15:46:05
    最近了解了一下C#中Encoding的不同编码方式的区别,和大家分享一下,如果有不对的地方还请各位批评指教。   简单的说,为什么需要编码? 比如,我们的计算机中需要表示字母'a','b'等等字母,然而这些字母如何...
  • NRZI编码格式详解

    2011-08-02 07:47:13
    USB传输的编码格式,与实现方法。 介绍了各种串行通讯编码格式的异同。
  • 常用的几种编码格式

    2011-12-01 10:46:55
    常用的几种编码格式
  • 快速高效的将GB2312,Big5等各种编码格式转换为UTF-8带签名方式!
  • 常见编码格式汇总

    千次阅读 2019-11-13 15:21:16
    编码格式 ASCII编码 使用8位二进制来编码,其中控制字符为不可见字符,而能够打印出来的为可见字符。 Unicode编码 Unicode又称为万国符,可以表示世界上的所有字符,编号范围从 0x000000 到 0x10FFFF ...
  • 容器格式编码格式

    千次阅读 2013-09-04 21:30:01
     音频视频编码及文件格式(容器)是一个很庞大的知识领域,完整的说清楚,那就需要些写成一本教材了。这里先就几个简单的概念问题作以介绍:   首先要分清楚媒体文件和编码的区别:  文件是既包括视频又包括...
  • 视频容器格式编码格式简介

    千次阅读 2016-01-18 14:57:48
    过去几年还不流行在线视频的时候,大家可以用迅雷下载到各种格式的视频。可以简单的理解成视频扩展名就是视频的容器格式。   视频容器格式 又叫封装格式,就是把已经编码封装好的视频、音频按照一定的规范放到一起...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 284,023
精华内容 113,609
关键字:

编码的各种格式