现在的位置: 首页 > 综合 > 正文

java中文乱码的两篇文章(好)

2013年09月09日 ⁄ 综合 ⁄ 共 5134字 ⁄ 字号 评论关闭
http://blog.csdn.net/xulz/archive/2005/07/21/430712.aspx
做java web开发是不是会遇到编码问题,有网页之间参数传递的,也有与数据库存取有关的.下面是介绍相关内容的文章.
从 汉化 到 国际化 
这是我们公司总结的一些关于中文乱码问题的一些解决方案和经验和大家分享!
遇到编码问题主要是由于Tomcat服务器端接收request对象默认是ISO_8859_1编码方式,对于大量解决中文问题看到过添加Filter方式来统一解决.
其实在POST前可通过request.setCharacterEncoding("GBK");来解决.

对于Java由于默认的编码方式是 UNICODE,所以用中文也易出问题,常见的解决是
String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”);
//由于String类的构造方法可以使用指定的编码方式,缺省使用本地编码.则getBytes 方法用于将中文字符以“ISO-8859-1”编码方式转化成字节数组,而“GBK” 是目标编码方式。

------------------------------------------------------------------------------------------------------------
下面是weblogic介绍的一些知识:
字符编码简介

ASCII:只提供对128个英文字符的支持
ISO8859-1:每个字节表示一个字符,一个中文字符表示成两个字符,占两个字节UTF-8:英文占一个字节,中文占两个或三个字节
GB2312:英文占一个字节,中文占两个字节
GBK:在GB2312基础上提供了对扩展中文字符的支持
Big5:台湾使用的繁体中文的编码,类似于GB2312

Javac命令行参数-encoding指定了java源文件使用的编码
Java命令行参数-Dfile.encoding指定了class文件使用的编码
JDK 1.4中引入了java.nio.charset package

============================================================
IE里的编码行为
影响编码的选项:
1.“工具/Internet选项”菜单下的“高级/始终以UTF-8发送URL”(IE缺省设置)
2.HTML的head标签里的指定的content Type:<meta http-equiv=“Content-Type”content=“text/html”charset=“gbk”>
3.运行浏览器的windows的区域设置,这影响本机的缺省编码

对于post方式:
url采用UTF-8编码,再作URL Encoding;
parameter部分(及url里带的参数)采用HTML head里指定的编码(未指定使用本地缺省编码),但不作URL Encoding;
post数据采用HTML head里指定的编码,再作URL Encoding(content type为application/x-www-form-urlencoded 的情况下)

不选中“始终以UTF-8发送URL”时:
url、parameters和post数据均采用HTML head里指定的编码(未指定使用本地缺省编码);除了post数据,其他部分均不做URL Encoding

附:HTTP 1.1 规范:RFC2396 :
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
unreserved =alphanum| mark mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
escaped = "%" hex hex hex = digit | "A" | "B" | "C" | "D" | "E" | "F" | "a" | "b" | "c" | "d" | "e" | "f“

Servlet2.3关于HttpServletRequest的说明:
getRequestURI() : not decoded
getServletPath() : decoded

--------------------------------------------------------------------------------------------------------------------------
常见问题及解决:
Q:jsp里边的所有中文在浏览器端显示不正常:
A:<%@ pagecontentType=“text/html;charset=GBK“%>
为使浏览器能正确显示中文,应在HTML <HEAD> 部分增加:
<meta http-equiv="ContentType"content="text/html"charset="gbk">

Q:response.setContentType(“Application/msword”)返回的word文档乱码:
A:在content type中指定编码:response.setContentType(“application/msword;charset=/”GBK/””)

其他编码问题:对于Oracle数据库:
使用select * from NLS_DATABASE_PARAMETERS;来查看数据库的字符集设置
使用alter database character set utf8来修改
使用oci driver时,需要在客户端设置正确的NLS_LANG环境变量

*注释:l10n i18n都是缩写:用的是英文单词的首尾字母和其间字母个数
l10n: localization 本地化
i18n: internationalization 国际化

http://blog.csdn.net/zgbsoap/archive/2005/10/25/516031.aspx

http://www.matrix.org.cn/thread.shtml?topicId=21142&fid=14

以下是我做的中文乱码的总结,希望能帮你解决问题:
一般在传送时使用的encoding:
使用GET 的方式:
String test = new String((request.getParameter("test")).getBytes("ISO-8859-1"),"GBK");

使用POST 的方式:
request.setCharacterEncoding("GBK");

pageEncoding及contentType的作用:
<%@ page pageEncoding="GBK" %>
pageEncoding是当jsp转译成_jsp.java时使用的encoding.预设是iso8859_1.
然後_jsp.java编译成_jsp.class是使用utf-8作为encoding.
response.setContentType("text/html; charset=GBK");
or
<%@ page contentType="text/html;charset=GBK" %>
就是输出到浏览器时的编码,预设是iso8859_1.
这样浏览器才知道应该用甚麽charset来显示.

资料库输出到jsp出现乱码:
第一,检查一下你database里的资料是否乱码.
如果database里的资料是乱码,检查一下再进入资料库时request接收後资料是否是乱码.
即忘了加入request.setCharacterEncoding(String charset);
request.setCharacterEncoding(String charset)把表单传送过来的资料以charset的字型来encoding.
如果接收时是正常的.但资料库是乱码,
那就检查一下database的编码设定.

如果资料库的资料正常.但输出到jsp的资料是乱码.
以mysql为例:
String connect = "jdbc:mysql://localhost/dbname?user=&password=&useUnicode=true&characterEncoding=GBK";
就上面的mysql的例子.
需要设定useUnicode为true.
而characterEncoding=GBK必须与contentType的charset一样.
mysql的设定档my.ini:
[client]  default-character-set=GBK
[mysqld]  default-character-set=GBK

以下连结则介绍了access的jdbc:odbc的编码:
http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/bridge.html

include资料出现乱码:
旧的版本tomcat是不能在每一页jsp中加入
<%@ page contentType="text/html; charset=GBK" %>
tomcat 5.x之後是可以每一页都加入上面那一句的.
会必须include的page及被include的page的编码要相同.连大小写都要相同.

但这样做不是最好的方法.

其实可以在你的web application底下的web.xml的<web-app>里加入:


<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"version="2.4">
.........
.........  
<jsp-config>
<jsp-property-group>  
  <description>jsp encoding example</description>
  <display-name>JSPConfiguration</display-name>
  <url-pattern>*.jsp</url-pattern>
  <el-ignored>true</el-ignored>
  <page-encoding>GBK</page-encoding>
  <scripting-invalid>false</scripting-invalid>
  <include-prelude></include-prelude>
  <include-coda></include-coda>
  <description>html encoding example</description>
  <display-name>JSPConfiguration</display-name>  
  <url-pattern>*.html</url-pattern>  
  <el-ignored>true</el-ignored>
  <page-encoding>GBK</page-encoding>
  <scripting-invalid>false</scripting-invalid>
  <include-prelude></include-prelude>  
  <include-coda></include-coda>
</jsp-property-group>
</jsp-config>
.........
.........
</web-app>

apache整合tomcat 中文问题:
apache+tomcat+JK2集成时,http的请求是通过jk2的ajp13转到tomcat的8009端口处理的,
所以要修改tomcat/conf/server.xml中的以下两项
1 <Connector port="8080"    ……  URIEncoding="GBK" >
2 <Connector port="8009"    ……  URIEncoding="GBK" >
都加上URIEncoding="GBK"。

以下是javaman写的中文问题总结:
http://www.matrix.org.cn/forum_view.asp?forum_id=14&view_id=676 

抱歉!评论已关闭.