gb18030 unicode,GB18030 UniCode14
GB 2312/gbk/GB 18030/big5/unicode/utf-8编码-35不甘平淡-51t测试软件测试网51t测试软件测试网-中国软件测试人员的精神家园-由X-Space提供动力
GB 2312/gbk/GB 18030/big5/unicode/utf-8编码
经常碰到一些关于编码的术语,特意收录了一些信息供参考。
GB2312:简体中文编码
gbk:GB 2312的扩展
GB 18030:gbk的扩展
BIG5:繁体中文编码
UNICODE:国际通用字符集
UTF 8:国际通用字符编码
附件:字符集和编码
在各个国家和地区制定的不同ANSI编码标准中,只规定了各自语言所要求的“字符”。例如,汉字标准(GB2312)没有规定如何存储韩文字符。这些ANSI编码标准包含两层含义:
1.要使用哪些字符。也就是说,标准中会包括哪些汉字、字母、符号。包含“字符”的集合称为“字符集”。
2.指定每个“字符”应该存储在一个字节还是多个字节中,以及应该使用哪些字节进行存储。这种调节叫做“编码”。
国家和地区在制定编码标准时,一般会同时制定“字符集”和“编码”。因此,我们通常所说的“字符集”,如GB2312、GBK、JIS等。不仅有“字符集合”的意思,还包括“编码”的意思。
UNICODE字符集包含各种语言中使用的所有字符。编码UNICODE字符集的标准有很多,比如UTF-8、UTF-7、UTF-16、Unicode Little、Unicode Big等。
附:编码原理
编码无处不在。数据库,文件,编辑器,IDE,编译器,浏览器.
代码(如Java、JSP、ASP、PHP、Python、Ruby等)中的字符串比较麻烦,涉及编辑器、编译器、解释器等等。
所以,我的做法是,我从来不直接在代码里写字符串资源,尤其是双字节编码的字符串资源。
它将字符串资源分成一个单独的资源文件。这样,你只需要负责这个文件的编码。
需要注意的是,文件、数据库、网络传输中的数据都是byte[]。
下面的讨论不涉及代码中字符串编码的问题。本文只讨论系统运行后各部分之间的编码问题。
先说Java。
JVM中的任何字符串资源都是Unicode的,也就是说,任何字符串类型数据都是Unicode编码的。没有例外。由于只有一种编码,我们可以说JVM中的字符串是未编码的。String相当于char[]。
JVM中的byte[]数据是编码的。比如Big5,GBK,GB2312,UTF-8等等。
一个GBK编码的字节[]转换成一个字符串,实际上就是GBK编码到Unicode编码的转换。
字符串转换成Big5编码的byte[]实际上就是Unicode编码到Big5编码的转换。
因此,Unicode是所有编码转换的中间媒介。的所有代码都有一个可以转换为Unicode的转换器,Unicode也可以转换为所有其他代码。这构成了总线结构。
例如,如果总共有10个代码,那么只有10个10=20转换器就足够了。如果执行成对直接转换,则所需的转换器数量为组合数,需要90个转换器。
系统的不同部分有自己的代码。比如数据库、文件、JVM、浏览器四个部分。
在这些部分之间交换数据时,会出现编码问题。比如数据库和JVM之间,文件和JVM之间,浏览器和JVM之间。这些问题的原理都是相互关联的。
处理编码问题最容易的地方是在文件和JVM之间。文件IO API有编码参数,请自行查阅。
最不容易出现编码问题的是数据库和JVM之间。这应该是数据库JDBC连接的基本功能。本文不具体讨论。
最容易出错的地方是浏览器和服务器JVM之间(其实代码中的字符串更容易出错,但我事先声明过,本文不会讨论代码中的字符串编码)。下面主要讨论这个浏览器和服务器JVM之间的编码问题。
我们把浏览器代码叫做Browser_Charset,把JVM代码叫做JVM_Charset(通常等于服务器系统代码)。
浏览器数据进来的时候是一个带Browser_Charset的byte[]。
如果用户处理程序需要字符串类型的数据,JVM会将这个byte[]转换成字符串。使用的转换器是JVM_Charset-Unicode。
注意,如果此时Browser_Charset和JVM_Charset不相等。那么,这种自动转换就是错误的。
来弥补这个错误。我们需要做两步。
(1) Unicode-JVM_Charset,把这个字符串转换回原来的byte[]。
(2) Browser_Charset-Unicode,将这个恢复的byte[]转换成字符串。
这个效果和直接从HTTP请求中获取byte[]然后执行(2) Browser_Charset-Unicode是一样的。
如果请求中设置了CharacterEncoding,那么POST数据参数就不需要自己手动转换,web服务器自动转换是正确的。URL的参数编码也涉及到URL编码,所以要考虑的问题更多,没那么简单。
当JVM向浏览器发送数据时。编码问题也需要考虑。它可以被设置为响应。此外,还可以在HTML Meta Header中设置编码,以提醒浏览器选择正确的编码。
某些语言中VM或解释器的字符串编码可能不同。比如Ruby。但是,转码的原理是一样的。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。