web开发中的中文问题
jetty处理的总结
http://docs.codehaus.org/display/JETTY/International+Characters+and+Character+Encodings
结论:
import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Map; import java.util.Properties; /** * 结论:在使用页面编码为gbk时:<br> * get时:ajax提交:firefox.ajax.get使用URLEncode(utf8)(但存在bug,见下),ie使用String.getByte( * 页面编码).注:此时charset不可信<br> * get时:form提交:ie,firefox使用页面编码(当前为gbk).注:此时charset没数据<br> * post时:ajax提交:ajax提交firefox、ie使用String.getByte(utf8)编码.注:此时charset不可信<br> * post时:表单提交:使用页面编码.注:此时charset没数据<br> * * firefox.ajax.post请求,在context-type的charset会自动设置为utf-8,无论你写什么。后台拿数据则通过utf-8 * 取得正确数据 ie.ajax.post请求,在context-type不设置情况下,后台拿默认charset(gbk)时解析出错。 * * 问题: 默认URIEncode使用ISO-8859-1,如何得到正确中文?: 答:自行将取出String.getByte(ISO-8859-1),再new * String(gbk)<br> * * jetty默认对uri使用utf8编码,如果希望其他编码方式,在jetty启动时设置:-Dorg.mortbay.util.URI.charset=gbk * tomcat默认对uri使用iso-8859-1编码,如果希望其他编码,配置connector的URIEncoding=gbk * * 问题: firefox为什么在页面编码gbk下ajax.post可行而ie不行? * 答:firefox下ajax.post传输的是utf-8,context-type中charset不允许用户修改,就算用户设置了,仍为utf-8 * ie下ajax.post传输的是utf-8,但是context-type的charset允许设置或默认按页面编码,如果页面编码是gbk就出错了。 * * firefox.ajax.get的bug情况: * firefox默认情况是按URLEncode(utf8)的,但是如果下拉框默认有数据,则按页面编码gbk发送,此时charset不可信 * * * * @author W_jiangyongyuan * */ public class Test { public static void main(String[] args) throws UnsupportedEncodingException { Test t = new Test(); // t.utf8_ajax_post(); // t.utf8_form_get_post(); // t.get_ajax_gbk_firefox(); // t.get_ajax_gbk_ie(); // t.change_charset(); // t.change_charset2(); t.change_charset3(); // t.change_charset4(); } String s = "中高风险"; /** * ie下ajax.get按页面编码,不使用charset * * @throws UnsupportedEncodingException */ void get_ajax_gbk_ie() throws UnsupportedEncodingException { String value = new String(s.getBytes("UTF-8"), "GBK");// 传输了utf8,转成gbk,firebug界面看到的乱码 String value2 = new String(URLEncoder.encode(s, "GBK") .getBytes("UTF-8"));// 传输了utf8,转成gbk,firebug界面看到的乱码 System.out.println(value2); } /** * firefox下ajax.get按charset编码,通过URLEncode(charset)调用 * * @throws UnsupportedEncodingException */ void get_ajax_gbk_firefox() throws UnsupportedEncodingException { System.out.println(URLEncoder.encode(s, "UTF8"));// %D6%D0%CE%C4 } /** * form点击按钮提交,编码按页面编码并通过URLEncodeer提交。 * get,post一致,ie,firefox一致,URLEncoder(gbk) * * @throws UnsupportedEncodingException */ void utf8_form_get_post() throws UnsupportedEncodingException { System.out.println(URLEncoder.encode("中文", "GBK"));// %D6%D0%CE%C4 } /** * ajax.post方式,全部用utf8编码,无论是否设置了context-type中的charset为其他数据<br> * ie,firefox一致,String.getByte("utf-8") * * @throws UnsupportedEncodingException */ void utf8_ajax_post() throws UnsupportedEncodingException { System.out.println("test utf8 post"); String value = new String(s.getBytes("UTF-8"), "GBK");// 传输了utf8,转成gbk,firebug界面看到的乱码 System.out.println(value); } /** * utf-8错误转成gbk后可能可以正确转回,当字符为2的倍数时。因为utf-8码中文为三个字符 * @throws UnsupportedEncodingException */ void change_charset2() throws UnsupportedEncodingException { String s = "中文"; printByte("utf-8", s); String s2 = new String(s.getBytes("utf-8"), "gbk"); printByte("gbk", s2); String s3 = new String(s2.getBytes("gbk"), "utf-8"); printByte("utf-8", s3); //如果s只有一个字符,则无法转回 } /** * gbk错误转成utf8后无法正确转回 * @throws UnsupportedEncodingException */ void change_charset3() throws UnsupportedEncodingException { String s = "中文"; printByte("gbk", s); String s2 = new String(s.getBytes("gbk"), "utf-8"); printByte("utf-8", s2); String s3 = new String(s2.getBytes("utf-8"), "gbk"); printByte("gbk", s3); System.out.println(s3); } /** * gbk数据错误转成iso-8859-1后可以正确转回gbk * @throws UnsupportedEncodingException */ void change_charset4() throws UnsupportedEncodingException { String s = "中文"; printByte("gbk", s); String s2 = new String(s.getBytes("gbk"), "iso-8859-1"); printByte("iso-8859-1", s2); String s3 = new String(s2.getBytes("iso-8859-1"), "gbk"); printByte("gbk", s3); } void printByte(String charset, String s2) throws UnsupportedEncodingException { System.out.println(s2); System.out.println("\nnow is " + charset); for (Byte b : s2.getBytes(charset)) { System.out.print(Integer.toHexString(b)); } System.out.println("\n"); } }
上面代码中的change_charset中,测试证明
对于错误转码的情况,将gbk码的字符错误当成utf-8后,无法恢复gbk.因为byte数据已经改变。
而iso-8859和gbk时却不会改变乱码的byte数据。
相关推荐
Java 中文问题是 Java web 开发中常见的一种问题,解决该问题需要了解 Java 中文编码、字符集和过滤器的使用。本文将总结 Java 中文问题的解决方法,并提供实践经验和代码示例。 一、支持中文 在 Java 中,支持...
### 解决Web开发中的中文问题 在Web开发过程中,中文乱码问题是非常常见的一个问题,尤其对于使用Tomcat服务器的应用程序来说。本篇文章将详细介绍导致这一问题的原因以及如何解决这一问题。 #### 一、问题背景与...
在Java Web开发中,中文乱码问题一直是开发人员面临的常见问题之一。中文乱码通常是由于在字符编码转换过程中,字符集不一致或设置不当所导致。为了解决这一问题,首先需要了解Java Web工程字符编码的基本理论,包括...
PHP和MySQL Web开发_中文PHP和MySQL Web开发_中文PHP和MySQL Web开发_中文PHP和MySQL Web开发_中文PHP和MySQL Web开发_中文PHP和MySQL Web开发_中文
PHP和MySQL Web开发_中文PHP和MySQL Web开发_中文PHP和MySQL Web开发_中文PHP和MySQL Web开发_中文PHP和MySQL Web开发_中文PHP和MySQL Web开发_中文
根据提供的文件内容,这份文档的标题是“kotlin 开发 web 中文文档”,描述中提到的是一本关于使用Kotlin进行现代Web开发的书籍,书籍名称为“Modern Web Development with Kotlin”。这本书是Leanpub平台上的一个...
第二部分讨论了Web开发要素,探讨了Web开发过程中不可避免的问题,及如何通过测试解决这些问题。第三部分探讨了一些高级话题,如模拟技术、集成第三方插件、Ajax、测试固件、持续集成等。本书适合Web开发人员阅读。
《PHP和MySQL Web开发(原书第4版)》中文译版.pdf
在Java Web开发中,中文乱码问题是一个常见的困扰,尤其对于使用Servlet和JSP技术的开发者来说。乱码问题的产生主要源于字符编码的不一致性,即在Web组件之间、Web组件与浏览器、以及Web组件与数据库之间的字符集...
### Java Web开发中常见的中文乱码问题解析 在Java Web开发过程中,中文乱码问题是开发者经常遇到的一个挑战。这些问题主要源于Java默认的Unicode编码与HTML页面及表单默认的Latin-1编码之间的不兼容,以及在不同的...
**JavaScript**是Web开发中的脚本语言,用于实现网页的动态交互。它在客户端运行,可以更新DOM(文档对象模型),改变网页内容,处理用户事件,甚至与服务器进行异步通信(Ajax)。ES6(ECMAScript 6)的推出,为...
在Web开发中,尤其是使用MySQL数据库进行数据存储时,字符编码问题经常会导致中文或特殊字符显示为乱码,严重影响用户体验和数据的准确性。本文将详细探讨如何解决MySQL数据库在Web开发中的乱码问题,确保数据在各个...
极有用的web开发手册大全,且全部为中文的。包括; struts2.0中文帮助手册.chm XML指南.chm tomcat5.5中文手册.chm jsp.chm spring2[1].0中文开发参考手册by jxair.chm UML.2.0 Css2.0 中文手册.chm Apache2.0 js...
国际化和消息处理是现代Web应用开发中的重要部分。WebDynpro支持应用程序的多语言版本,它允许为不同的语言环境定制文本信息,并在运行时根据用户的语言偏好来展示信息。 输入帮助和语义帮助则是提高用户界面友好性...
《PHP与MySQL.WEB开发(中文版)》是一本深入探讨如何使用PHP和MySQL进行Web开发的专业书籍。这本书全面地涵盖了这两个技术领域的基础知识以及高级应用,旨在帮助读者掌握构建动态、交互式网站所需的关键技能。 PHP...
- "java":虽然标签中有"java",但这里可能更多是指Web开发中的Java后端技术,如Servlet、JSP等。不过,由于资料列表中没有明确的Java相关文件,这部分内容可能需要自行扩展学习。 - "开发资料":这暗示了资料包内...
本文主要讨论了在 Web 开发中遇到的中文乱码问题,并提供了一些解决方案。首先,需要确定中文乱码问题不是由浏览器引起的,然后讨论了 Tomcat 服务器配置和数据库 bean 配置中的一些解决方案。 一、浏览器配置问题 ...