动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.微软.Net VS Java两军对垒 Web服.
.JAVA中文问题及最优解法.
.Enterprise JavaBeans组件慨述(.
.tomcat的sql server数据源的配置.
.全面接触Java集合框架.
.JBuilder应用技巧一则.
.了解Struts1.1介绍.
.Java 2中的MVC设计模式.
.java中找到资源文件的路径.
.如何设计用JSF和MyFaces上传文件.
.选择Java接口还是抽象类.
.局域网电脑远程监控程序.
.垃圾回收.
.Java学习过程的一些重点(二).
.exp 方法.
.使用.NET框架类替代API调用的问题.
.教您如何成为 EJB 专家详解系列连.
.Thinking in Java第三版读书笔记.
.基于JMS的数据汇集系统的研究与实.
.心得总结:Java性能优化技巧集锦.

Java 关于中文乱码问题的解决方案与经验 (2)

发表日期:2008-1-5 |



  五、我们要对Java的编译器有所了解:

Javac ?encoding


我们经常没有用到encoding这个参数。其实encoding这个参数对于跨平台的操作是很重要的。假如没有指定encoding,则按照系统的默认encoding,gb平台上是gb2312,英文平台上是iso8859_1。Java的编译器实际上是调用sun.tools.Javac.main的类,对文件进行编译,这个类有compile函数中间有一个encoding的变量,-encoding的参数其实直接传给encoding变量。编译器就是根据这个变量来读取Java文件的,然后把用utf-8形式编译成class文件。例子代码:


String str = "你";
FileWriter writer = new FileWriter("text.txt");
write.write(str);
writer.close();

假如用gb2312编译,你会找到e4 bd a0的字段 ;
假如用8859_1编译, 00c4 00e3的二进制:
0000,0000 ,1100,0100 ,0000,0000 ,1110,0011
因为每个字符都大于7位,因此用11位编码:
1100,0001,1000,0100,1100,0011,1010,0011
c1-- 84-- c3--  a3
你会找到c1 84 c3 a3




但是我们往往忽略掉这个参数,因此这样往往会有跨平台的问题:

样例代码在中文平台上编译,生成zhclass

样例代码在英文平台上编译,输出enclass

(1) zhclass在中文平台上执行ok,但是在英文平台上不行

(2) enclass在英文平台上执行ok,但是在中文平台上不行

原因是:

(1) 在中文平台上编译后,其实str在运行态的char[]是0x4f60, 在中文平台上运行,filewriter的缺省编码是gb2312,因此chartobyteconverter会自动用调用gb2312的converter,把str转化成byte输入到fileoutputstream中,于是0xc4,0xe3放进了文件。但是假如是在英文平台下,chartobyteconverter的缺省值是8859_1, filewriter会自动调用8859_1去转化str,但是他无法解释,因此他会输出"?"

(2) 在英文平台上编译后,其实str在运行态的char[]是0x00c4 0x00e3, 在中文平台上运行,中文无法识别,因此会出现??;在英文平台上,0x00c4-->0xc4,0x00e3->0xe3,因此0xc4,0xe3被放进了文件。

六、其它原因:


<%@ page contentType="text/Html; charset=GBK" %>




设置浏览器的显示编码,假如response的数据是utf8编码,显示将是乱码,但是乱码和上述原因还不一样。

七、发生编码的地方:

1. 从数据库到Java程序 byte??〉char

2. 从Java程序到数据库 char??〉byte

3. 从文件到Java程序 byte??〉char

4. 从Java程序到文件 char??〉byte

5. 从Java程序到页面显示 char??〉byte

6. 从页面form提交数据到Java程序byte??〉char

7. 从流到Java程序byte??〉char

8. 从Java程序到流char??〉byte

可以使用配置过滤器的方法解决中文乱码的:


<web-app>
<filter>
<filter-name>RequestFilter</filter-name>
<filter-class>net.golden.uirs.util.RequestFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>RequestFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
</web-app>


public void doFilter(ServletRequest req, ServletResponse res,
FilterChain fChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession();
String userId = (String) session.getAttribute("userid");
req.setCharacterEncoding(this.filterConfig.getInitParameter("charset"));
// 设置字符集?
实际上是设置了byte ??〉char的encoding
try {
if (userId == null userId.equals("")) {
if (!request.getRequestURL().toString().matches(
".*/uirs/logon/logon(Controller){0,1}\x2EJsp$")) {
session.invalidate();
response.sendRedirect(request.getContextPath() +
"/uirs/logon/logon.Jsp");
}
}
else {
// 看看是否具有信息上报系统的权限
if (!net.golden.uirs.util.UirsChecker.check(userId, "信息上报系统",
net.golden.uirs.util.UirsChecker.ACTION_DO)) {
if (!request.getRequestURL().toString().matches(
".*/uirs/logon/logon(Controller){0,1}\x2EJsp$")) {
response.sendRedirect(request.getContextPath() +
"/uirs/logon/logonController.Jsp");
}
}
}
}
catch (Exception ex) {
response.sendRedirect(request.getContextPath() +
"/uirs/logon/logon.Jsp");
}
fChain.doFilter(req, res);
}
上一篇:Java 和 XML 为何将成功 人气:345
下一篇:java 应用程序的发布 人气:665
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-12 team论坛 v2.0.4 bulid 080916 A
2008-10-12 Roclog v3.1.6
2008-10-12 SupeV v1.0.1 简体中文 GBK
2008-10-12 NetCMS v1.6.0.1010 正式版
2008-10-12 PHP考试系统PPFrame v1.2.7
2008-10-12 LPAS个人相册 v1.6.3
2008-10-12 快问仿百度知道系统 动态-静态-互
2008-10-12 方卡广告防点击系统 V1.0 GB2312
2008-10-12 泡菜内容管理系统[PCMS] v1.0 Bu
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成