`

web开发中的中文问题

    博客分类:
  • java
 
阅读更多

 

 

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 web 开发中常见的一种问题,解决该问题需要了解 Java 中文编码、字符集和过滤器的使用。本文将总结 Java 中文问题的解决方法,并提供实践经验和代码示例。 一、支持中文 在 Java 中,支持...

    解决web开发中的中文问题.doc

    ### 解决Web开发中的中文问题 在Web开发过程中,中文乱码问题是非常常见的一个问题,尤其对于使用Tomcat服务器的应用程序来说。本篇文章将详细介绍导致这一问题的原因以及如何解决这一问题。 #### 一、问题背景与...

    Java WEB开发中的中文乱码问题解决方法.pdf

    在Java Web开发中,中文乱码问题一直是开发人员面临的常见问题之一。中文乱码通常是由于在字符编码转换过程中,字符集不一致或设置不当所导致。为了解决这一问题,首先需要了解Java Web工程字符编码的基本理论,包括...

    PHP和MySQL Web开发_中文5

    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开发_中文PHP和MySQL Web开发_中文

    kotlin 开发 web 中文文档

    根据提供的文件内容,这份文档的标题是“kotlin 开发 web 中文文档”,描述中提到的是一本关于使用Kotlin进行现代Web开发的书籍,书籍名称为“Modern Web Development with Kotlin”。这本书是Leanpub平台上的一个...

    Python Web开发:测试驱动方法(中文扫描版)

    第二部分讨论了Web开发要素,探讨了Web开发过程中不可避免的问题,及如何通过测试解决这些问题。第三部分探讨了一些高级话题,如模拟技术、集成第三方插件、Ajax、测试固件、持续集成等。本书适合Web开发人员阅读。

    《PHP和MySQL Web开发(原书第4版)》中文译版.pdf

    《PHP和MySQL Web开发(原书第4版)》中文译版.pdf

    Java Web开发中文乱码问题的研究与解决.pdf

    在Java Web开发中,中文乱码问题是一个常见的困扰,尤其对于使用Servlet和JSP技术的开发者来说。乱码问题的产生主要源于字符编码的不一致性,即在Web组件之间、Web组件与浏览器、以及Web组件与数据库之间的字符集...

    Java Web开发常见问题.pdf

    ### Java Web开发中常见的中文乱码问题解析 在Java Web开发过程中,中文乱码问题是开发者经常遇到的一个挑战。这些问题主要源于Java默认的Unicode编码与HTML页面及表单默认的Latin-1编码之间的不兼容,以及在不同的...

    全套Web开发手册

    **JavaScript**是Web开发中的脚本语言,用于实现网页的动态交互。它在客户端运行,可以更新DOM(文档对象模型),改变网页内容,处理用户事件,甚至与服务器进行异步通信(Ajax)。ES6(ECMAScript 6)的推出,为...

    解决Mysql数据库在web开发中乱码问题

    在Web开发中,尤其是使用MySQL数据库进行数据存储时,字符编码问题经常会导致中文或特殊字符显示为乱码,严重影响用户体验和数据的准确性。本文将详细探讨如何解决MySQL数据库在Web开发中的乱码问题,确保数据在各个...

    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...

    SAP_ABAP_WebDynpro开发(中文)(官方文档)

    国际化和消息处理是现代Web应用开发中的重要部分。WebDynpro支持应用程序的多语言版本,它允许为不同的语言环境定制文本信息,并在运行时根据用户的语言偏好来展示信息。 输入帮助和语义帮助则是提高用户界面友好性...

    PHP与MySQL.WEB开发(中文版)

    《PHP与MySQL.WEB开发(中文版)》是一本深入探讨如何使用PHP和MySQL进行Web开发的专业书籍。这本书全面地涵盖了这两个技术领域的基础知识以及高级应用,旨在帮助读者掌握构建动态、交互式网站所需的关键技能。 PHP...

    web 开发资料全套

    - "java":虽然标签中有"java",但这里可能更多是指Web开发中的Java后端技术,如Servlet、JSP等。不过,由于资料列表中没有明确的Java相关文件,这部分内容可能需要自行扩展学习。 - "开发资料":这暗示了资料包内...

    配置web-xml解决中文乱码问题.pdf

    本文主要讨论了在 Web 开发中遇到的中文乱码问题,并提供了一些解决方案。首先,需要确定中文乱码问题不是由浏览器引起的,然后讨论了 Tomcat 服务器配置和数据库 bean 配置中的一些解决方案。 一、浏览器配置问题 ...

Global site tag (gtag.js) - Google Analytics