深入Java中文问题及最优解决方法-下(转)
4、中文问题的分类及其建议最优解决办法
了解以上JAVA处理文件的原理之后,我们就可以提出了一套建议最优的解决汉字问题的办法。
我们的目标是:我们在中文系统中编辑的含有中文字符串或进行中文处理的JAVA源程序经编译后可以移值到任何其它的操作系统中正确运行,或拿到其它操作系统中编译后能正确运行,能正确地传递中文和英文参数,能正确地和数据库交流中英文字符串。
我们的具体思路是:在JAVA程序转码的入口和出口及JAVA程序同用户有输入输出转换的地方限制编码方法使之正确即可。
具体解决办法如下:
1、 针对直接在console上运行的类
对于这种情况,我们建议在程序编写时,如果需要从用户端接收用户的可能含有中文的输入或含有中文的输出,程序中应该采用字符流来处理输入和输出,具体来说,应用以下面向字符型节点流类型:
对文件:FileReader,FileWrieter
其字节型节点流类型为:FileInputStream,FileOutputStream
对内存(数组):CharArrayReader,CharArrayWriter
其字节型节点流类型为:ByteArrayInputStream,ByteArrayOutputStream
对内存(字符串):StringReader,StringWriter
对管道:PipedReader,PipedWriter
其字节型节点流类型为:PipedInputStream,PipedOutputStream
同时,应该用以下面向字符型处理流来处理输入和输出:
BufferedWriter,BufferedReader
其字节型的处理流为:BufferedInputeStream,BufferedOutputStream
InputStreamReader,OutputStreamWriter
其字节型的处理流为:DataInputStream,DataOutputStream
其中InputStreamReader和InputStreamWriter用于将字节流按照指定的字符编码集转换到字符流,如:
InputStreamReader in = new InputStreamReader(System.in,"GB2312");
OutputStreamWriter out = new OutputStreamWriter (System.out,"GB2312");
例如:采用如下的示例JAVA编码就达到了要求:
//Read.java
import java.io.*;
public class Read {
public static void main(String[] args) throws IOException {
String str = "/n中文测试,这是内部硬编码的串"+"/ntest english character";
String strin= "";
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in,"gb2312")); //设置输入接口按中文编码
BufferedWriter stdout = new BufferedWriter(new OutputStreamWriter(System.out,"gb2312")); //设置输出接口按中文编码
stdout.write("请输入:");
stdout.flush();
strin = stdin.readLine();
stdout.write("这是从用户输入的串:"+strin);
stdout.write(str);
stdout.flush();
}}
同时,在编译程序时,我们用以下方式来进行:
javac -encoding gb2312 Read.java
其运行结果如图5所示:
图5
2、 针对EJB类和不可以直接运行的支持类(如JavaBean类)
由于这种类它们本身被其它的类调用,不直接与用户交互,故对这种类来说,我们的建议的处理方式是内部程序中应该采用字符流来处理程序内部的中文字符串(具体如上面一节中一样),同时,在编译类时用-encoding gb2312参数指示源文件是中文格式编码的即可。
3、 针对Servlet类
针对Servlet,我们建议用以下方法:
在编译Servlet类的源程序时,用-encoding指定编码为GBK或GB2312,且在向用户输出时的编码部分用response对象的setContentType("text/html;charset=GBK");或gb2312来设置输出编码格式,同样在接收用户输入时,我们用request.setCharacterEncoding("GB2312");这样无论我们的servlet类移植到什么操作系统中,只有客户端的浏览器支持中文显示,就可以正确显示。如下是一个正确的示例:
//HelloWorld.java
package hello;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
public void init() throws ServletException { }
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
request.setCharacterEncoding("GB2312"); //设置输入编码格式
response.setContentType("text/html;charset=GB2312"); //设置输出编码格式
PrintWriter out = response.getWriter(); //建议使用PrintWriter输出
out.println("<hr>");
out.println("Hello World! This is created by Servlet!测试中文!");
out.println("<hr>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
request.setCharacterEncoding("GB2312"); //设置输入编码格式
response.setContentType("text/html;charset=GB2312"); //设置输出编码格式
String name = request.getParameter("name");
String id = request.getParameter("id");
if(name==null) name="";
if(id==null) id="";
PrintWriter out = response.getWriter(); //建议使用PrintWriter输出
out.println("<hr>");
out.println("你传入的中文字串是:" + name);
out.println("<hr>你输入的id是:" + id);
out.println("<hr>");
}
public void destroy() { }
}
请用javac -encoding gb2312 HelloWorld.java来编译此程序。
测试此Servlet的程序如下所示:
<%@page contentType="text/html; charset=gb2312"%>
<%request.setCharacterEncoding("GB2312");%>
<html><head><title></title>
<Script language="JavaScript">
function Submit() {
//通过URL传递中文字符串值给Servlet
document.base.action = "./HelloWorld?name=中文";
document.base.method = "POST";
document.base.submit();
}
</Script>
</head>
<body bgcolor="#FFFFFF" text="#000000" topmargin="5">
<form name="base" method = "POST" target="_self">
<input name="id" type="text" value="" size="30">
<a href = "JavaScript:Submit()">传给Servlet</a>
</form></body></html>
其运行结果如图6所示:
图6
4、 JAVA程序和数据库之间
为避免JAVA程序和数据库之间数据传递出现乱码现象,我们建议采用以下最优方法来处理:
1、 对于JAVA程序的处理方法按我们指定的方法处理。
2、 把数据库默认支持的编码格式改为GBK或GB2312的。
如:在mysql中,我们可以在配置文件my.ini中加入以下语句实现:
在[mysqld]区增加:
default-character-set=gbk
并增加:
[client]
default-character-set=gbk
在SQL Server2K中,我们可以将数据库默认的语言设置为Simplified Chinese来达到目的。
5、 针对JSP代码
由于JSP是在运行时,由WEB容器进行动态编译的,如果我们没有指定JSP源文件的编码格式,则JSP编译器会获得服务器操作系统的file.encoding值来对JSP文件编译的,它在移植时最容易出问题,如在中文win2k中可以很好运行的jsp文件拿到英文linux中就不行,尽管客户端都是一样的,那是因为容器在编译JSP文件时获取的操作系统的编码不同造成的(在中文wink中的file.encoding和在英文Linux中file.encoding是不同的,且英文Linux的file.encoding对中文不支持,所以编译出来的JSP类就会有问题)。网络上讨论的大多数是此类问题,多是因为JSP文件移植平台时不能正确显示的问题,对于这类问题,我们了解了JAVA中程序编码转换的原理,解决起来就容易多了。我们建议的解决办法如下:
1、我们要保证JSP向客户端输出时是采用中文编码方式输出的,即无论如何我们首先在我们的JSP源代编中加入以下一行:
<%@page contentType="text/html; charset=gb2312"%>
2、为了让JSP能正确获得传入的参数,我们在JSP源文件头加入下面一句:
<%request.setCharacterEncoding("GB2312");%>
3、为了让JSP编译器能正确地解码我们的含有中文字符的JSP文件,我们需要在JSP源文件中指定我们的JSP源文件的编码格式,具体来说,我们在JSP源文件头上加入下面的一句即可:
<%@page pageEncoding="GB2312"%>或<%@page pageEncoding="GBK"%>
这是JSP规范2.0新增加的指令。
我们建议使用此方法来解JSP文件中的中文问题,下面的代码是一个正确做法的JSP文件的测试程序:
//testchinese.jsp
<%@page pageEncoding="GB2312"%>
<%@page contentType="text/html; charset=gb2312"%>
<%request.setCharacterEncoding("GB2312");%>
<%
String action = request.getParameter("ACTION");
String name = "";
String str = "";
if(action!=null && action.equals("SENT"))
{
name = request.getParameter("name");
str = request.getParameter("str");
}
%>
<html>
<head>
<title></title>
<Script language="JavaScript">
function Submit()
{
document.base.action = "?ACTION=SENT&str=传入的中文";
document.base.method = "POST";
document.base.submit();
}
</Script>
</head>
<body bgcolor="#FFFFFF" text="#000000" topmargin="5">
<form name="base" method = "POST" target="_self">
<input type="text" name="name" value="" size="30">
<a href = "JavaScript:Submit()">提交</a>
</form>
<%
if(action!=null && action.equals("SENT"))
{
out.println("<br>你输入的字符为:"+name);
out.println("<br>你通过URL传入的字符为:"+str);
}
%>
</body>
</html>
如图7是此程序运行的结果示意图:
图7
5、总结
在上面的详细分析中,我们清晰地给出了JAVA在处理源程序过程中的详细转换过程,为我们正确解决JAVA编程中的中文问题提供了基础。同时,我们给出了认为是最优的解决JAVA中文问题的办法。
6、参考资料
1、段明辉.Java 编程技术中汉字问题的分析及解决.
http://www-900.ibm.com/developerWorks/cn/java/java_chinese/index.shtml
2、 周竞涛.关于Java中文问题的几条分析原则
http://www-900.ibm.com/developerWorks/cn/java/l-javachinese/index.shtml
深入Java中文问题及最优解决方法-下(转)相关推荐
- 深入Java中文问题及最优解决方法--上(转)
说明:本文为作者原创,作者联系地址为: josserchai@yahoo.com .由于Java编程中的中文问题是一个老生常谈的问题,在阅读了许多关于Java中文问题解决方法之后,结合作者的编程实践, ...
- JAVA 代码交互率低的原因分析,深入剖析Java编程中的中文问题及建议最优解决方法...
说明:本文为作者原创,作者联系地址为: josserchai@yahoo.com .由于 Java 编程中的中文 问题是一个老生常谈的问题,在阅读了许多关于 Java 中文问题解决方法之后,结合作者的 ...
- 深入Java中文编码乱码问题及最优解决方法
说明:原创作者联系地址为:josserchai@yahoo.com . 由于Java编程中的中文问题是一个老生常谈的问题,在阅读了许多关于Java中文问题解决方法之后,结合作者的编程实践,我发现过去谈 ...
- Maya2018快捷键F键或A键聚焦物体时物体消失的Bug最优解决方法:只用修改userPrefs.mel脚本中的一个参数即可。(亲测有效)
一.Maya2018这个Bug让人抓狂,网上很多方法无解 最近在使用Maya2018时发现一个比较严重的Bug,就是在透视视窗或者其他视窗里,对选中物体按F键或A键聚焦时,视窗里面的物体会莫名其妙全部 ...
- java校验特殊字符_java中文及特殊字符的校验方法
本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 1.关于Character.UnicodeBlock的介绍 CJK的意思是"Chinese,Japane ...
- SpringMVC项目中中文字符乱码问题及解决办法总结(非专业最优解决办法) -- ajax传值乱码; request.getParameter()乱码;
SpringMVC项目中中文字符乱码问题及解决办法总结(非专业最优解决办法) -- ajax传值乱码; request.getParameter()乱码; 参考文章: (1)SpringMVC项目中中 ...
- java中文乱码 例子_JSP中文乱码常见3个例子及其解决方法
常见3个例子及其解决方法如下 实例一.jsp页面显示时 中文乱码--jsp页面显示时 木兰辞拟古决绝词柬友 人生若只如初见,何事秋风悲画扇. 等闲变却故人心,却道故人心易变. 骊山语罢清宵半,泪雨霖铃 ...
- java中文乱码的原因及解决方法
在java开发中都能遇到java中文乱码的情况,怎样才能够恰当地选择汉字编码方式并正确地处理汉字的编码呢?希望通过下面的总结的java中文乱码解决方法对遇到过此类问题的朋友有所帮助. 首先,要想解决j ...
- java.net.url 中文乱码,.Net获取URL中文参数值的乱码问题解决方法总结
本文总结分析了.Net获取URL中文参数值的乱码问题解决方法.分享给大家供大家参考,具体如下: 解决方法: 1.设置web.config文件 2.传递中文之前,将要传递的中文参数进行编码,在接收时再进 ...
最新文章
- 白话Elasticsearch02- 结构化搜索之filter执行原理bitset机制与caching机制
- Go进阶(6): uuid生成及其作用
- 《Orange’s 一个操作系统的实现》3.保护模式7-特权级转移(通过调用门转移目标段-无特权级转换)...
- [mybatis]缓存_缓存有关的设置以及属性
- php时间转两位数年份,PHP常用时间函数资料整理
- Oracle ERP权限管理
- java回忆录—输入输出流详细讲解(入门经典)
- 矩形覆盖-----批了外皮的亲蛙跳
- 2015百度之星资格赛.1004放盘子(数学推导)
- 自媒体时事热点类素材哪里找?推荐这3个网站
- 网络模型早停earlystopping详解
- 列联表分析-独立性检验
- python算日期_python中的日期计算
- 基于C++的高性能http框架cinatra及其web框架示例feather介绍及开发演示
- Proximity sensor---Px318J
- 时间的单位 频率单位 换算
- 基于ASP的房屋租售信息管理系统的设计与实现
- 向量图 正弦交流电路_第五节 正弦交流电路的相量(图)法求解.ppt
- 网络安全必学知识点之XSS漏洞
- 【洛谷试炼场】普及练习场——排序Ex
热门文章
- 【JSP】JSP的四种作用域
- 【C语言】第四章 逻辑判断与选择结构 题解
- 有机物燃烧的化学方程式配平(洛谷P1994题题解,Java语言描述)
- 【Python】Python中常用的字符串处理函数
- 12月29日二周五次【Python基础语法】
- 【安全牛学习笔记】缓冲区溢出
- 中文版microbit:TurnipBit显示动态滚动字符教程实例
- Python自动化运维之13、异常处理及反射(__import__,getattr,hasattr,setattr)
- 面试题36:数组中的逆序对
- 使用jquery当页面打开时,将修改样式的点击事件绑定到Dom