Ticket #117 (closed Bug: fixed)

Opened 14 years ago

Last modified 14 years ago

接收点评出现乱码

Reported by: qinghonggang Owned by:
Priority: major Milestone: 2012报价库5.0
Component: 产品库 Version: 产品库3.0
Keywords: Cc:
Due Date: 28/08/2012

Description

起因:移动那边提交到电脑网点评系统的点评出现了乱码。
原由:移动提交过来的参数是用utf-8编码的,点评这边转码的时候用的是gbk,所以就乱了。
解决方式:new String(f.getTitle().getBytes("gbk"),"utf-8")。
详情分析:JVM里面的任何字符串资源都是Unicode,就是说任何String类型的数据都是Unicode编码,没有例外。既然只有一种编码,那么,我们可以这么说,JVM里面的String是不带编码的(String相当于 char[])。 JVM里面的 byte[] 数据是带编码的,比如,Big5,GBK,GB2312,UTF-8之类的。 一个GBK编码的byte[] 转换成 String,其实就是从GBK编码向Unicode编码转换。 一个String转换成一个Big5编码的byte[],其实就是从Unicode编码向Big5编码转换。

所以,Unicode是所有编码转换的中间介质。所有的编码都有一个转换器可以转换到Unicode,而Unicode也可以转换到其他所有的编码。这样构成了一个总线结构。

我们把浏览器编码叫做 Browser_Charset,把JVM编码叫做JVM_Charset(通常等于服务器系统编码)。 当浏览器的数据过来的时候,是一个带有Browser_Charset的byte[]。 如果用户处理程序需要一个String类型的数据,那么JVM会好心好意地把这个byte[]转换成String。使用的转换器是JVM_Charset -> Unicode。 注意,如果这个时候,Browser_Charset 和 JVM_Charset并不相等。那么,这个自动转换是错误的。 为了弥补这个错误。我们需要做两步工作。
(1) Unicode -> JVM_Charset,把这个String 转换回到原来的 byte[]。
(2) Browser_Charset -> Unicode,把这个还原的byte[]转换成 String。
这个效果,和直接从HTTP Request取得byte[],然后执行 (2) Browser_Charset -> Unicode 的效果是一样的。 如果在Request里面设置了CharacterEncoding,那么POST Data参数就不需要自己手工转换了,web server的自动转换就是正确的(struts的一些内部操作很导致action里面设CharacterEncoding无效)。

关于字符与编码的发展过程以及原理和一些基本概念可以参看附件。

Attachments

字符编码及乱码原理讲解.doc Download (101.0 KB) - added by qinghonggang 14 years ago.
本文介绍了字符与编码的发展过程,相关概念的正确理解。举例说明了一些实际应用中,编码的实现方法。然后,本文讲述了通常对字符与编码的几种误解,由于这些误解而导致乱码产生的原因,以及消除乱码的办法。

Change History

Changed 14 years ago by qinghonggang

本文介绍了字符与编码的发展过程,相关概念的正确理解。举例说明了一些实际应用中,编码的实现方法。然后,本文讲述了通常对字符与编码的几种误解,由于这些误解而导致乱码产生的原因,以及消除乱码的办法。

comment:1 Changed 14 years ago by chenchongqi

very good

comment:2 Changed 14 years ago by chenchongqi

  • Status changed from new to closed
  • Resolution set to fixed
Note: See TracTickets for help on using tickets.