开发者社区 问答 正文

深入分析字符编码之五-常见问题分析


在了解了 Java Web 中可能需要编码的地方后,下面看一下,当我们碰到一些乱码时,应该怎么处理这些问题?出现乱码问题唯一的原因都是在 char 到 byte 或 byte 到 char 转换中编码和解码的字符集不一致导致的,由于往往一次操作涉及到多次编解码,所以出现乱码时很难查找到底是哪个环节出现了问题,下面就几种常见的现象进行分析。

中文变成了看不懂的字符


例如,字符串“淘!我喜欢!”变成了“Ì Ô £ ¡Î Ò Ï²»¶ £ ¡”编码过程如下图所示




这种情况是这样的,ISO-8859-1 字符集的编码范围是 0000-00FF,正好和一个字节的编码范围相对应。这种特性保证了使用 ISO-8859-1 进行编码和解码可以保持编码数值“不变”。虽然中文字符在经过网络传输时,被错误地“拆”成了两个欧洲字符,但由于输出时也是用 ISO-8859-1,结果被“拆”开的中文字的两半又被合并在一起,从而又刚好组成了一个正确的汉字。虽然最终能取得正确的汉字,但是还是不建议用这种不正常的方式取得参数值,因为这中间增加了一次额外的编码与解码,这种情况出现乱码时因为 Tomcat 的配置文件中 useBodyEncodingForURI 配置项没有设置为”true”,从而造成第一次解析式用 ISO-8859-1 来解析才造成乱码的。


总结


本文首先总结了几种常见编码格式的区别,然后介绍了支持中文的几种编码格式,并比较了它们的使用场景。接着介绍了 Java 那些地方会涉及到编码问题,已经 Java 中如何对编码的支持。并以网络 I/O 为例重点介绍了 HTTP 请求中的存在编码的地方,以及 Tomcat 对 HTTP 协议的解析,最后分析了我们平常遇到的乱码问题出现的原因。
综上所述,要解决中文问题,首先要搞清楚哪些地方会引起字符到字节的编码以及字节到字符的解码,最常见的地方就是读取会存储数据到磁盘,或者数据要经过网络传输。然后针对这些地方搞清楚操作这些数据的框架的或系统是如何控制编码的,正确设置编码格式,避免使用软件默认的或者是操作系统平台默认的编码格式。

原创文章,转载请注明:转载自 http://www.whohelpme.com/blog/main/NO1.html

展开
收起
夏天的日子 2016-05-08 15:40:36 5203 分享 版权
阿里云 AI 助理回答

在Java Web开发中遇到乱码问题时,确实需要细致地排查和处理编码不一致的情况。根据您描述的问题,这里提供一些解决乱码问题的通用策略和具体操作步骤:

1. 确定正确的字符集

  • 明确需求:首先确定项目中应该使用的字符集,对于中文网站,通常推荐使用UTF-8
  • 统一配置:确保整个应用从数据库、服务器、应用程序到前端页面都使用同一字符集。

2. Tomcat配置调整

  • server.xml:在Tomcat的conf/server.xml文件中,找到Connector标签,确保设置URIEncoding="UTF-8"useBodyEncodingForURI="true"。这可以确保GET请求中的参数正确解码。
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" 
           URIEncoding="UTF-8"
           useBodyEncodingForURI="true"/>
  • web.xml:在应用的WEB-INF/web.xml中,可以通过 <jsp-config> 标签指定JSP页面的默认编码为UTF-8
<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
</jsp-config>

3. Java代码层面处理

  • 读写文件:使用FileReaderFileWriter等类时,通过构造函数指定字符集,如new InputStreamReader(inputStream, "UTF-8")
  • 网络传输:对于HTTP请求和响应,显式设置字符集,例如在HttpURLConnection中设置connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");

4. 数据库连接

  • 确保数据库连接字符串中指定了正确的字符集,如MySQL的URL参数?useUnicode=true&characterEncoding=UTF-8

5. 前端页面

  • 在HTML头部声明正确的字符集<meta charset="UTF-8">

6. 日志系统

  • 如果使用日志记录,也要确保日志输出时采用正确的编码。

7. 测试与调试

  • 使用工具(如Postman)发送请求时,检查发送内容的编码是否正确。
  • 在接收端打印接收到的原始数据,帮助定位是发送端还是接收端的编码问题。

结论

解决乱码问题的关键在于确保数据在各个处理环节中保持一致的字符编码。一旦发现乱码,应从数据的输入、处理、输出三个阶段逐一检查,确认每个环节的编码设置,并进行相应的调整。遵循“预防为主”的原则,在项目初期就统一编码规范,可以有效避免乱码问题的发生。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答