request.Dispatecher disp=request.getRequestDispatcher("servlet")
dis.forward(request,response)
request.setAttribute()
/// 中文乱码解决方案
首先在 server.xml 中添加 URIEncoding="GBK",如 CSDN 上所说。
将MyEclipse 生成的 JSP 页面的"pageEncoding"改成 GBK。
如果表单的 method 是get 的话,可以直接使用 request.getParameter("")获得没有乱码的中文。
如果表单的 method 是post 的话,可以通过添加"request.setCharacterEncoding("GBK");"语句,
随后使用 request.getParameter("");获得没有乱码的中文。
世界上的各地区都有本地的语言。地区差异直接导致了语言环境的差异。在开发一个国际化程序的
过程中,处理语言问题就显得很重要了。
这是一个世界范围内都存在的问题,所以,Java 提供了世界性的解决方法。本文描述的方法是
用于处理中文的,但是,推而广之,对于处理世界上其它国家和地区的语言同样适用。
汉字是双字节的。所谓双字节是指一个双字要占用两个 BYTE 的位置(即 16 位),分别称为高
位和低位。中国规定的汉字编码为 GB2312,这是强制性的,目前几乎所有的能处理中文的应用程序
都支持 GB2312。GB2312 包括了一二级汉字和 9区符号,高位从 0xa1 到0xfe,低位也是从 0xa1 到
0xfe,其中,汉字的编码范围为 0xb0a1 到0xf7fe。
另外有一种编码,叫做 GBK,但这是一份规范,不是强制的。GBK 提供了 20902 个汉字,它兼容
GB2312,编码范围为 0x8140 到0xfefe。GBK 中的所有字符都可以一一映射到 Unicode 2.0。
在不久的将来,中国会颁布另一种标准:GB18030-2000(GBK2K)。它收录了藏、蒙等少数民族
的字型,从根本上解决了字位不足的问题。注意:它不再是定长的。其二字节部份与 GBK 兼容,四
字节部分是扩充的字符、字形。它的首字节和第三字节从 0x81 到0xfe,二字节和第四字节从 0x30
到0x39。
本文不打算介绍 Unicode,有兴趣的可以浏览“http://www.unicode.org/”查看更多的信息。
Unicode 有一个特性:它包括了世界上所有的字符字形。所以,各个地区的语言都可以建立与
Unicode 的映射关系,而 Java 正是利用了这一点以达到异种语言之间的转换。
在JDK 中,与中文相关的编码有:
表1 JDK 中与中文相关的编码列表
编码名称说明 ASCII7 位,与 ascii7 相同 ISO8859-18-位,与 8859_1,ISO-8859-1,ISO_8859-
1,latin1...等相同 GB2312-8016 位,与 gb2312,gb2312-1980,EUC_CN,euccn,1381,Cp1381, 1383,
Cp1383, ISO2022CN,ISO2022CN_GB...等相同 GBK 与MS936 相同,注意:区分大小写 UTF8 与UTF-8
相同 GB18030 与cp1392、1392 相同,目前支持的 JDK 很少 在实际编程时,接触得比较多的是
GB2312(GBK)和 ISO8859-1。
为什么会有“?”号
上文说过,异种语言之间的转换是通过 Unicode 来完成的。假设有两种不同的语言 A和B,转换
的步骤为:先把 A转化为 Unicode,再把 Unicode 转化为 B。
举例说明。有 GB2312 中有一个汉字“李”,其编码为“C0EE”,欲转化为 ISO8859-1 编码。步
骤为:先把“李”字转化为 Unicode,得到“674E”,再把“674E”转化为 ISO8859-1 字符。当然,
这个映射不会成功,因为 ISO8859-1 中根本就没有与“674E”对应的字符。
当映射不成功时,问题就发生了!当从某语言向 Unicode 转化时,如果在某语言中没有该字
符,得到的将是 Unicode 的代码“\uffffd”(“\u”表示是 Unicode 编码,)。而从 Unicode 向某
语言转化时,如果某语言没有对应的字符,则得到的是“0x3f”(“?”)。这就是“?”的由来。