gb18030 unicode,GB18030 UniCode14

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: