热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

字符编码详解——彻底理解掌握编码知识,“乱码”不复存在(转载)

每一个程序员都不可避免的遇到字符编码的问题as设置编码,特别是做Web开发的程序员,“乱码问题”一直是让人头疼的问题,也许您已经很少遇到“

  每一个程序员都不可避免的遇到字符编码的问题as设置编码,特别是做Web开发的程序员,“乱码问题”一直是让人头疼的问题,也许您已经

  很少遇到“乱码”问题as设置编码,然而,对解决乱码的方法的内在原理,您是否明白?本人作为一个程序员,在字符编码方面同样遇到不少

  问题,而且一直对各种编码懵懵懂懂、不清不楚;在工作中也曾经遇到一个很烦人的编码问题as设置编码。这两天在网上收集了大量编码方面

  的资料,对字符编码算是理解的比较清楚了as设置编码。下面把我认为比较重要的知识点记录下来,一方面方便以后复习;另一方面也希望给

  跟我一样懵懵懂懂的人一个参考as设置编码。不对或不妥之处,请批评指正。

  在此之前,先了解一些有用概念:“字符集”、“字符编码”和“内码”as设置编码

  1、字符集与字符编码

  字符是各种文字和符号的总称,包括各个国家文字、标点符号、图形符号、数字等as设置编码。字符集是多个字符的集合,字符集种类较多,

  每个字符集包含的字符个数不同as设置编码,常见字符集有:ASCII字符集、ISO 8859字符集、GB2312字符集、BIG5字符集、GB18030字符集、

  Unicode字符集等as设置编码。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。

  编码(encoding)和字符集不同as设置编码。字符集只是字符的集合,不一定适合作网络传送、处理,有时须经编码(encode)后才能应用。如

  Unicode可依不同需要以UTF-8、UTF-16、UTF-32等方式编码as设置编码

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

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

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

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

  各个国家和地区在制定编码标准的时候,“字符的集合”和“编码”一般都是同时制定的as设置编码。因此,平常我们所说的“字符集”,比

  如:GB2312, GBK, JIS 等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义as设置编码

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

  2、什么是内码as设置编码

  2.1 维基百科的解释

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

  同的系统中,会有不同的内码as设置编码

  在以往的英文系统中,内码为ASCIIas设置编码。在繁体中文系统中,目前常用的内码为大五码(Big5)。在简体中文系统中,内码则为国标

  码(国家标准代码:现在强制要求使用GB18030标准;较旧计算机仍然使用GB2312)as设置编码。而统一码(Unicode)则为另一常见内码。

  2.2 百度百科的解释

  内码是指整机系统中使用的二进制字符编码as设置编码,是沟通输入、输出与系统平台之间的交换码,通过内码可以达到通用和高效率传输文

  本的目的as设置编码。比如MS Word中所存储的疯狂的减肥和调用的就是内码而非图形文字。英文ASCII字符采用一个字节的内码表示,中文字

  符如国标字符集中as设置编码,GB2312、GB12345、GB13000皆用双字节内码,GB18030(27,533汉字)双字节内码汉字为20,902个,其余6,631

  个汉字用四字节内码as设置编码

  3、字符编码分类总结

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

  3.1 ASCII编码

  以下来自“维基百科”:

  ASCII(American Standard Code for Information Interchangeas设置编码,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统

  as设置编码。它主要用于显示现代英语,而其扩展版本EASCII则可以勉强显示其他西欧语言。它是现今最通用的单字节编码系统(但是有被

  UniCode追上的迹象),并等同于国际标准ISO/IEC 646as设置编码

  ASCII第一次以规范标准的型态发表是在1967年as设置编码,最后一次更新则是在1986年,至今为止共定义了128个字符;其中33个字符无法显

  示(这是以现今操作系统为依归as设置编码,但在DOS模式下可显示出一些诸如笑脸、扑克牌花式等8-bit符号),且这33个字符多数都已是陈

  废的控制字符as设置编码。控制字符的用途主要是用来操控已经处理过的文字。在33个字符之外的是95个可显示的字符,包含用键盘敲下空白

  键所产生的空白字符也算1个可显示字符(显示为空白)as设置编码

  ASCII表:见

  ASCII缺点:

  ASCII的最大缺点是只能显示26个基本拉丁字母、阿拉伯数目字和英式标点符号as设置编码,因此只能用于显示现代美国英语(而且在处理英

  语当中的外来词如na?ve、café、élite等等时,所有重音符号都不得不去掉,即使这样做会违反拼写规则)as设置编码。而EASCII虽然解决了

  部份西欧语言的显示问题,但对更多其他语言依然无能为力as设置编码。因此现在的苹果电脑已经抛弃ASCII而转用Unicode。

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

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

  3.2 ANSI编码

  为使计算机支持更多语言,通常使用0x800~xFF范围的2个字节来表示1个字符as设置编码。比如:汉字 '中' 在中文操作系统中,使用

  [0xD6,0xD0]这两个字节存储as设置编码

  不同的国家和地区制定了不同的标准,由此产生了GB2312,BIG5,JIS等各自的编码标准as设置编码。这些使用2个字节来代表一个字符的各种汉

  字延伸编码方式,称为 ANSI 编码as设置编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS

  编码as设置编码

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

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

  在使用ANSI编码支持多语言阶段as设置编码,每个字符使用一个字节或多个字节来表示(MBCS,Multi-Byte Character System),因此,这

  种方式存放的字符也被称作多字节字符as设置编码。比如,"中文123" 在中文 Windows 95 内存中为7个字节,每个汉字占2个字节,每个英文

  和数字字符占1个字节as设置编码

  在非 Unicode 环境下,由于不同国家和地区采用的字符集不一致,很可能出现无法正常显示所有字符的情况as设置编码。微软公司使用了代

  码页(Codepage)转换表的技术来过渡性的部分解决这一问题as设置编码,即通过指定的转换表将非 Unicode 的字符编码转换为同一字符对

  应的系统内部使用的 Unicode 编码as设置编码。可以在“语言与区域设置”中选择一个代码页作为非 Unicode 编码所采用的默认编码方式,

  如936为简体中文GBK,950为正体中文Big5(皆指PC上使用的)as设置编码。在这种情况下,一些非英语的欧洲语言编写的软件和文档很可能

  出现乱码as设置编码。而将代码页设置为相应语言中文处理又会出现问题,这一情况无法避免。从根本上说,完全采用统一编码才是解决之道

  ,但目前尚无法做到这一点as设置编码

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

  3.3 Unicode编码

  为了使国际间信息交流更加方便as设置编码,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号

  ,以满足跨语言、跨平台进行文本转换、处理的要求as设置编码

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

  编码,UCS-4用4个字节编码as设置编码

  在 UNICODE 被采用之后,计算机存放字符串时,改为存放每个字符在 UNICODE 字符集中的序号as设置编码。目前计算机一般使用 2 个字节

  (16 位)来存放一个序号(DBCS,Double Byte Character System),因此,这种方式存放的字符也被称作宽字节字符as设置编码。比如,字

  符串 "中文123" 在 Windows 2000 下,内存中实际存放的是 5 个序号,一共10个字节as设置编码

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

  UTF-16, UnicodeLittle, UnicodeBig 等as设置编码

  4、常用编码规则

  4.1 单字节字符编码

  (1)编码标准:ISO-8859-1as设置编码

  (2)说明:最简单的编码规则,每一个字节直接作为一个 UNICODE 字符as设置编码。比如,[0xD6, 0xD0] 这两个字节,通过 iso-8859-1

  转化为字符串时,将直接得到 [0x00D6, 0x00D0] 两个 UNICODE 字符,即 "?D"as设置编码

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

  4.2 ANSI编码

  (1)GB2312, BIG5, Shift_JIS, ISO-8859-2as设置编码

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

  多个字节as设置编码

  反之,将字节串转化成字符串时,也可能多个字节转化成一个字符as设置编码。比如,[0xD6, 0xD0] 这两个字节,通过 GB2312 转化为字符

  串时,将得到 [0x4E2D] 一个字符,即 '中' 字as设置编码

  “ANSI 编码”的特点:

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

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

  4.3 UNICODE编码

  (1)编码标准:UTF-8, UTF-16, UnicodeBigas设置编码

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

  字节as设置编码

  与“ANSI 编码”不同的是:

字符编码详解——彻底理解掌握编码知识,“乱码”不复存在(转载)

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

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

  我们实际上没有必要去深究每一种编码具体把某一个字符编码成了哪几个字节as设置编码,我们只需要知道“编码”的概念就是把“字符”转

  化成“字节”就可以了as设置编码。对于“UNICODE 编码”,由于它们是可以通过计算得到的,因此,在特殊的场合,我们可以去了解某一种

  “UNICODE 编码”是怎样的规则as设置编码

  5、编码的区别

  5.1 GB2312、GBK和GB18030

  (1)GB2312

  当中国人们得到计算机时as设置编码,已经没有可以利用的字节状态来表示汉字,况且有6000多个常用汉字需要保存,于是想到把那些ASCII

  码中127号之后的奇异符号们直接取消掉, 规定:一个小于127的字符的意义与原来相同as设置编码,但两个大于127的字符连在一起时,就表

  示一个汉字as设置编码,前面的一个字节(称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出

  大约7000多个简体汉字了as设置编码。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来

  就有的数字、标点、字母都统统重新编了两个字节长的编码as设置编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字

  符了as设置编码。这种汉字方案叫做 "GB2312"。GB2312 是对 ASCII 的中文扩展。兼容ASCII。

  (2)GBK

  但是中国的汉字太多了as设置编码,我们很快就就发现有许多人的人名没有办法在这里打出来,不得不继续把 GB2312 没有用到的码位找出来

  用上as设置编码。后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的

  开始,不管后面跟的是不是扩展字符集里的内容as设置编码。结果扩展之后的编码方案被称为 “GBK” 标准,GBK 包括了 GB2312 的所有内

  容,同时又增加了近20000个新的汉字(包括繁体字)和符号as设置编码

  (3)GB18030

  后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK 扩成了 GB18030as设置编码。从此之后,中华民族的文

  化就可以在计算机时代中传承了as设置编码

  中国的程序员们看到这一系列汉字编码的标准是好的as设置编码,于是通称他们叫做 "DBCS"(Double Byte Charecter Set 双字节字符集)

  as设置编码。在DBCS系列标准里,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,因此他们写的程序为了

  支持中文处理,必须要注意字串里的每一个字节的值,如果这个值是大于127的,那么就认为一个双字节字符集里的字符出现了as设置编码

  在这种情况下,"一个汉字算两个英文字符!"as设置编码。然而,在Unicode环境下却并非总是如此。

  5.1 Unicode和BigEndianUnicode

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

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

  在Unicode里,所有的字符被一视同仁as设置编码。汉字不再使用“两个扩展ASCII”,而是使用“1个Unicode”,注意,现在的汉字是“一个

  字符”了,于是,拆字、统计字数这些问题也就自然而然的解决了as设置编码

  但是as设置编码,这个世界不是理想的,不可能在一夜之间所有的系统都使用Unicode来处理字符,所以Unicode在诞生之日,就必须考虑一个

  严峻的问题:和ASCII字符集之间的不兼容问题as设置编码

  我们知道,ASCII字符是单个字节的,比如“A”的ASCII是65as设置编码。而Unicode是双字节的,比如“A”的Unicode是0065,这就造成了一

  个非常大的问题:以前处理ASCII的那套机制不能被用来处理Unicode了as设置编码

  另一个更加严重的问题是as设置编码,C语言使用'\\0'作为字符串结尾,而Unicode里恰恰有很多字符都有一个字节为0,这样一来,C语言的字

  符串函数将无法正常处理Unicode,除非把世界上所有用C写的程序以及他们所用的函数库全部换掉as设置编码

  于是as设置编码,比Unicode更伟大的东东诞生了,之所以说它更伟大是因为它让Unicode不再存在于纸上,而是真实的存在于我们大家的电脑

  中as设置编码。那就是:UTF。

  UTF= UCS Transformation Format,即UCS转换(传输)格式as设置编码

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

  这两种都是Unicode的编码实现as设置编码

  5.2.1 UTF-8

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

  0000 - 007F 0xxxxxxx

  0080 - 07FF 110xxxxx 10xxxxxx

  0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

  例如“汉”字的Unicode编码是6C49as设置编码。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49

  写成二进制是:0110 110001 001001,用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89as设置编码

  可见UTF-8是变长的as设置编码,将Unicode编码为00000000-0000007F的字符,用单个字节来表示; 00000080-000007FF的字符用两个字节表

  示;00000800-0000FFFF的字符用3字节表示as设置编码。因为目前为止Unicode-16规范没有指定FFFF以上的字符,所以UTF-8最多是使用3个字

  节来表示一个字符as设置编码。但理论上来说,UTF-8最多需要用6字节表示一个字符。

  UTF-8兼容ASCIIas设置编码

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

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

  UTF-16以16位为单元对UCS进行编码as设置编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于

  0x10000的UCS码,定义了一个算法as设置编码。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为

  UTF-16和UCS-2基本相同as设置编码。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。

  UTF-16不兼容ASCIIas设置编码

  5.2.3 UTF-7

  UTF-7 (7-位元 Unicode 转换格式(Unicode Transformation Formatas设置编码,简写成 UTF)) 是一种可变长度字元编码方式,用以将

  Unicode 字元以 ASCII 编码的字元串来呈现,可以应用在电子邮件传输之类的应用as设置编码

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

  6、Unicode与UTF

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

  6.1 UTF的字节序和BOM

  6.1.1 字节序

  UTF-8以字节为编码单元,没有字节序的问题as设置编码。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码

  单元的字节序as设置编码。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,

  那么这是“奎”还是“乙”as设置编码

  Unicode规范中推荐的标记字节顺序的方法是BOMas设置编码。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点

  小聪明的想法:

  在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFFas设置编码。而FFFE在UCS中是不存在的字符,所以不应该出

  现在实际传输中as设置编码。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。

  这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的as设置编码。因此字

  符"ZERO WIDTH NO-BREAK SPACE"又被称作BOMas设置编码

  UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式as设置编码。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF(读

  者可以用我们前面介绍的编码方法验证一下)as设置编码。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

  6.1.2 BOM

  (1)BOM的来历

  为了识别 Unicode 文件,Microsoft 建议所有的 Unicode 文件应该以 ZERO WIDTH NOBREAK SPACE(U+FEFF)字符开头as设置编码。这作为

  一个“特征符”或“字节顺序标记(byte-order mark,BOM)”来识别文件中使用的编码和字节顺序as设置编码

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

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

  ①JDK1.5以及之前的Reader都不能处理带有BOM的UTF-8编码的文件as设置编码,解析这种格式的xml文件时,会抛出异常:Content is not

  allowed in prologas设置编码。“对于解决方法,之后我会写篇文章专门讨论该问题。”

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

  ③不同的编辑工具对BOM的处理也各不相同as设置编码。使用Windows自带的记事本将文件保存为UTF-8编码的时候,记事本会自动在文件开头

  插入BOM(虽然BOM对UTF-8来说并不是必须的)as设置编码。而其它很多编辑器用不用BOM是可以选择的。UTF-8、UTF-16都是如此。

  (3)BOM与XML

  XML解析读取XML文档时as设置编码,W3C定义了3条规则:

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

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

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

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

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

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

  开头字节 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)采取一种比较安全的方式来决定字符集及其编码,那就是弹出一个对话框来请示用户as设置编码

  然而MBCS文本(ANSI)没有这些位于开头的字符集标记as设置编码,现在很多软件保存文本为Unicode时,可以选择是否保存这些位于开头的

  字符集标记as设置编码。因此,软件不应该依赖于这种途径。这时,软件可以采取一种比较安全的方式来决定字符集及其编码,那就是弹出一

  个对话框来请示用户as设置编码

  (3)采取自己“猜”的方法as设置编码

  如果软件不想麻烦用户as设置编码,或者它不方便向用户请示,那它只能采取自己“猜”的方法,软件可以根据整个文本的特征来猜测它可能

  属于哪个charset,这就很可能不准了as设置编码。使用记事本打开那个“联通”文件就属于这种情况。(把原本属于ANSI编码的文件当成

  UTF-8处理as设置编码,详细说明见:)

  6.3 记事本的几种编码

  (1)ANSI编码

  记事本默认保存的编码格式是:ANSI,即本地操作系统默认的内码,简体中文一般为GB2312as设置编码。这个怎么验证呢?用记事本保存后,

  使用EmEditor、EditPlus和UltraEdit之类的文本编辑器打开as设置编码。推荐使用EmEditor,打开后,在又下角会显示编码:GB2312。

  (2)Unicode编码

  用记事本另存为时,编码选择“Unicode”,用EmEditor打开该文件,发现编码格式是:UTF-16LE+BOM(有签名)as设置编码。用十六进制方

  式查看,发现开头两字节为:FF FEas设置编码。这就是BOM。

  (3)Unicode big endian

  用记事本另存为时,编码选择“Unicode”,用EmEditor打开该文件,发现编码格式是:UTF-16BE+BOM(有签名)as设置编码。用十六进制方

  式查看,发现开头两字节为:FE FFas设置编码。这就是BOM。

  (4)UTF-8

  用记事本另存为时,编码选择“UTF-8”,用EmEditor打开该文件,发现编码格式是:UTF-8(有签名)as设置编码。用十六进制方式查看,发

  现开头三个字节为:dkfjdakfjkdajf爱好EF BB BFas设置编码。这就是BOM。

  7、几种误解as设置编码,以及乱码产生的原因和解决办法

  7.1 误解一

  在将“字节串”转化成“UNICODE 字符串”时as设置编码,比如在读取文本文件时,或者通过网络传输文本时,容易将“字节串”简单地作为

  单字节字符串,采用每“一个字节”就是“一个字符”的方法进行转化as设置编码

  而实际上as设置编码,在非英文的环境中,应该将“字节串”作为 ANSI 字符串,采用适当的编码来得到 UNICODE 字符串,有可能“多个字

  节”才能得到“一个字符”as设置编码

  通常,一直在英文环境下做开发的程序员们,容易有这种误解as设置编码

  7.2 误解二

  在 DOS,Windows 98 等非 UNICODE 环境下,字符串都是以 ANSI 编码的字节形式存在的as设置编码。这种以字节形式存在的字符串,必须知

  道是哪种编码才能被正确地使用as设置编码。这使我们形成了一个惯性思维:“字符串的编码”。

  当 UNICODE 被支持后as设置编码,Java 中的 String 是以字符的“序号”来存储的,不是以“某种编码的字节”来存储的,因此已经不存在

  “字符串的编码”这个概念了as设置编码。只有在“字符串”与“字节串”转化时,或者,将一个“字节串”当成一个 ANSI 字符串时,才有

  编码的概念as设置编码

  不少的人都有这个误解as设置编码

  7.3 分析与解决

  第一种误解,往往是导致乱码产生的原因as设置编码。第二种误解,往往导致本来容易纠正的乱码问题变得更复杂。

  在这里as设置编码,我们可以看到,其中所讲的“误解一”,即采用每“一个字节”就是“一个字符”的转化方法,实际上也就等同于采用

  iso-8859-1 进行转化as设置编码。因此,我们常常使用 bytes = string.getBytes("iso-8859-1") 来进行逆向操作,得到原始的“字节串”

  as设置编码。然后再使用正确的 ANSI 编码,比如 string = new String(bytes, "GB2312"),来得到正确的“UNI快递费街道CODE 字符串”


推荐阅读
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 《2017年3月全国计算机等级考试二级C语言上机题库完全版》由会员分享,可在线阅读,更多相关《2017年3月全国计算机等级考试二级C语言上机题库完全版( ... [详细]
  • 1关于字符串相邻的两个或多个字符串字面值(引号引起来的字符)将会自动连接到一起:str_catpython!str_cat输出:python!把很长 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • C语言学习笔记—链表(二)链表的静态添加及动态遍历
    链表的静态添加及动态遍历我们知道数组中的数据存储是有序的,而链表中的数据是无序的但是存在某种联系使之组成链表。那么我们如果向一组数据中添加一个数据元素, ... [详细]
author-avatar
我是雅小贱-
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有