当前位置:  技术问答>java相关

java中文问题

    来源: 互联网  发布时间:2015-04-04

    本文导语:  我得运行环境是,ms Sql server 2000 tomcat4.1,ie5,jdk1.3,运行  JSP时可以显示中文,运行applet是不能显示中文,用  Stirng strOut = new String(strIn.getBytes(),"ISO8859_1");  或  Stirng strOut = new String(strIn.getBytes(),"GBK");  或  Stirn...

我得运行环境是,ms Sql server 2000 tomcat4.1,ie5,jdk1.3,运行 
JSP时可以显示中文,运行applet是不能显示中文,用 
Stirng strOut = new String(strIn.getBytes(),"ISO8859_1"); 
或 
Stirng strOut = new String(strIn.getBytes(),"GBK"); 
或 
Stirng strOut = new String(strIn.getBytes(),"GB2312"); 
都试过,都不灵。 

|
你要确认strIn的编码,有许多种可能:utf-8,utf-8,gb2312,iso-8859-1等等.
如果确定了,就用String strOut = new String(strIn.getBytes("strIN的编码"),"你要输出字符串的编码");

|
你strIn是从哪取来的啊?!
如果是数据库看看数据库采用什么编码!
如果是HTML,JSP传过来的,用Stirng strOut = new String(strIn.getBytes(("ISO8859_1"),"GBK"); 应该可以解决的,当然你的WEBSERVER要使用ISO_88591编码!

|
运行jsp后产生的页面,用查看源码的方式核对一下,是否一定是中文?
如果是,说明数据库中是中文
如果不是,说明数据库中根本就不是中文
另外一种方法,直接用System.out.println(strIn) 来打印出来,看看是否可行

|
java的中文问题,和编译平台,运行平台,和Jdbc是否自动转换,数据库中如何存储都有关系。如果jsp的话,还有一个web server是否支持的问题。

|
我贴,不知道有没有一点启发?

■Solaris下Servlet编程的中文问题及解决办法
在使用Java开发Internet上的一个应用系统时,发现在Windows下调试完全正常的Servlet,上传到Solaris 服 务器上,运行却出现故障——返回的网页不能显示中文,应为中文的信息全为乱码;用中文信息做关键 字,不能正确检索数据库。后来采用加入检查代码等方法探知故障原因如下:

显示乱码主要是因为通过类 HttpServletResponse提供的方法setContentType 无法改变返回给客户的数据的 编码方式,正确的编码方式应为GB2312或者GBK,而事实上为缺省的ISO8859-1。无法检索中文信息则是因 为,客户提交的中文信息经浏览器编码到达服务器后,Servlet无法将其正确解码。

举例说明显示乱码解决方法
Servlet 一般通常做法如下:

public class ZldTestServlet extends HttpServlet { 

public void doGet (HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{

//在使用 Writer向浏览器返回数据前,设置 content-type header ,在这里设置相应的字符集gb2312 

response.setContentType("text/html;charset=gb2312"); 

PrintWriter out = response.getWriter(); //*

// 正式返回数据

out.println("〈html〉〈head〉〈title〉Servlet test〈/title〉〈/head〉" );

out.println("这是一个测试页!"); 

out.println("〈/body〉〈/html〉");

out.close(); 

}

...



解决页面显示乱码问题,需将*处代码换成如下内容:

PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(),"gb2312")); 

Solaris中文信息检索问题的解决
浏览器利用表单向服务器提交信息时,一般采用x-www-form-urlencoded 的MIME格式对数据进行编码。如 果使用get方法,参数名称和参数值经编码后附加在URL后,在Java中称作查询串(query string)。

在Servlet程序中,如果采用ServletRequest的方法getParameter取得参数值,在Solaris环境下,对汉字却不能正 确解码。因而无法正确检索数据库。

在Java 1.2的包——java.net中提供了URLEncode和URLDecode类。类URLEncode提供了按x-www-form- urlencoded格式对给定串进行转换的方法。类URLEncode则提供了逆方法。

在编写某网上114查询的Servlet时,采用先取得查询串,再利用类URLDecode解码,再从解码后的串中取得 参数,很好地解决了Solrais环境下,中文信息检索的问题。源代码就不在这里给出了,如果需要请和笔者联 系。

|
看一看chinacode.org上的一篇贴字:

中文显示原理研究

预备知识: 
 1.字节和unicode 
  Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式 
  是使用字节流的。 因此Java要对这些字节流经行转化。char是unicode的,而byte是字节. 
  Java中byte/char互转的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度, 
  可以用来告诉你,你用的Convertor。其中两个很常用的静态函数是 
   public static ByteToCharConverter getDefault() ; 
   public static ByteToCharConverter getConverter(String encoding); 
  如果你不指定converter,则系统会自动使用当前的Encoding,GB平台上用GBK,EN平台上用 
  8859_1 
   
  我们来就一个简单的例子: 
     "你"的gb码是:0xC4E3 ,unicode是0x4F60 
     你用: 
     --encoding="gb2312"; 
     --byte b[]={(byte)'u00c4',(byte)'u00E3'}; 
     --convertor=ByteToCharConverter.getConverter(encoding); 
     --char [] c=converter.convertAll(b); 
     --for(int i=0;i0xC4,0x00E3->0xE3,因此0xC4,0xE3被放进了 
 --文件 
---- 
1.对于JSP正文的解释: 
--Tomcat首先看一下你的叶面中有没有" 
你好 


http://localhost/test/test.jsp?value=你 

结果:你好你 

但这种方法局限性较大,比如对上传的文章分段,这样的做法是死定的,最好的 
解决方案是用这种方案: 


你好 



必读好文,但解决方案不敢恭维 


-------------------------------------------------------------------------------- 

1.网页传参数不提倡用get方法,而且用户可以调整是否用utf-8发送 
2.建议jsp中最好不要用,实际上加不加这句都有实现中文正常显示的方案,我认为不加方便些,至少不用写这些代码,如下的配置我认为可以使中文正常显示: 
a.所有的javabean用iso8859-1编译 
b.jsp文件中不要写以上charset=gb2312的语句(写了反而错) 

在tomcat情况下注意以上2点就行---了,等等,对于其他有可能不行的jsp服务器,加上以下 
c.服务器上的*作系统语言设为英文(像没有装类似bluepoint中文系统的linux一般本来就是英文) 
就行---了 

谁要是还不对,请报告.... 


Re:必读好文,但解决方案不敢恭维 


-------------------------------------------------------------------------------- 

Tomcat的参数问题无论是GET或是POST方式都是用8859_1编码的。这个可以看Tomcat Servlet实现的源代码: 
a) 对于POST方法 
 javax.servlet.http.HttpUtils的parsePostData方法: (对于POST的Form数据) 
 String postedBody = new String(postedBytes, 0, len, "8859_1");)这里是没有问题的因为中文都会用%来说明。但是parseName这个函数,却没有把是中文的东西整合起来,他只是简单的拼凑,因此可以认定他是使用8859_1的编码规则 
  sb.append((char) Integer.parseInt(s.substring(i+1, i+3), 16)); 
----  i += 2; 
-- 
b) 对于GET方法 
 org.apache.tomcat.service.http.HttpRequestAdapter 
   -- line=new String(buf, 0, count, 
       Constants.CharacterEncoding.Default); 
----Constants.CharacterEncoding.Default=8859_1 
 这段代码不好跟踪,千万不要被一些假象迷惑住。HttpRequestAdapter是从RequestImpl中派生的。但是,实际上用8080端口的Server并没有直接用到RequestImpl,而是用了HttpRequestAdapter来获得queryString 

对于加不加encoding,我保留我的意见,因为如果要解决上传文件分页问题,必须要用他来编码。而且编码能保证在一些Beans当中的传递性。 

看来我要在这里说明一下了 


-------------------------------------------------------------------------------- 

Tomcat仅仅是一个对jsp1.1,servlet2.2的一个标准的实现,我们不应该要求这个免费软件在细致末节上和性能上都面面俱到,它主要考虑的英文用户,这也是为什么不作特殊转换我们的汉字用url方法传递有问题的原因,我们大部分浏览器ie其高级设置中始终以utf-8发送url的选项缺省是选上的,如果说这是tomcat的bug也是可以的,另外Tomcat不管当前的*作系统是什么语言,好像都按iso8859去编译jsp,我觉得也有点欠妥,但是不管怎么说,新标准的实现和热门的软件在语言的支持方面永远都是先考虑英文 

我的方案什么说要好一些呢 
1.还是那句话,英文国家的软件永远都是先考虑英文,java虚拟机的规范中要求虚拟机内部必须实现iso8859,unicode,UTF-8三种,其他的不作要求,我们用的jdk中的虚拟机就是这样,嵌入式的就更不用说了,也就是说其他的ENCODE都很可能不是java虚拟机内部直接支持的,我们的中文自然也不在其列,需要外部的包支持转换,sun jdk应该在i18n.jar中,用iso8859速度最快,不需要其它调用和交换什么的,更没有读包的io*作 
2.至少少写了代码,没有额外*作,简洁的风格谁不喜欢 
3.所写的jsp页面国际性化好,我才写了一个jsp+javabeans的聊天室软件(没有用到servlet,jsp真的确实很好),同样的程序美国人用他们的浏览器进入就是英文界面,中文进入就是中文界面,如果加上charset=gb2312至少很麻烦 
4.限定了gb2312,如果用户要用GBK,怎么办,不加更好,不管什么的字符集,只要我当前浏览器设定的是,我就能显示出来 

总结:无论从速度上,开发效率上,和可扩展性上考虑,我的方案都比你的好,另外,我找不到你的方案比我的好的地方. 


[已被 webmaster 编辑过, 在 2001-01-21 11:23]

2001-01-21 11:20 IP: 查看 

javafan


初级会员

注册时间: 2001年4月
发帖数量: 3 如下的配置我认为可以使中文正常显示: 
a.所有的javabean用iso8859-1编译 
b.jsp文件中不要写以上charset=gb2312的语句(写了反而错) 

我用的是tomcat,根据上面配置,基本显示正常。 
但是从数据库中取出的中文数据不能正常显示。 
我用的数据库是sybase的。 

而我用iso8859-1编译javabean,在jsp文件中写上charset=gb2312. 
在javabean中所有String都用native2unicode编码, 
在jsp中都用unicode2native解码,可以在自己机子上正常显示. 
我用的是中文win2k. 
不知道在其他平台上能否正常显示???

|
问题可能出在任何一个环节:
Sql ServerJdbcjavabean..network....applet
在每一个环节测试编码方式iso-8859-1/GBK/gb2312/utf8...,应该能
发现问题在那个环节。

|
中文问题分析
     java的javac和java这两个命令在编译和运行java程序时是会去检测系统字符集的,然后会按照系统字符集来对字符进行转换。例如:当我们在西文系统中运行javac 命令时,它所选用的encode的字符集就是ISO8859_1,也就是说,它在编译的时候会将所有的ISO8859_1的字符串转换成为Unicode,此时如果程序中有其他字符集的字符串,譬如GBK的中文字串,则不做任何转换,仍然按照GBK的字符读入,而当它在西文平台下用java运行时,又会将Unicode转换成ISO8859_1输出,并将GBK的字符正常输出。因此,在西文环境下,中文可以正常的输出。如果在中文系统中运行javac 命令,则所有的GBK字符串会转换成Unicode,而所有的ISO8859_1的字符串会保留,同样在输出的时候也将Unicode转换成GBK字符集,因此也可以正常显示。

什么时候会出现中文乱码问题呢?

1:    在JDBC Driver里,有些Driver会对将插入数据库的和从数据库中读出的中文自动地转换成Unicode,而有些不会,如果Driver做过转换而系统又再做一次,就会出现问题,也就是常见的??,这时,我们需要的就是在不同的平台下根据不同的情况去将数据库做的不需要的转换抵消。举一个简单例子:系统是西文平台,数据库的Driver做过GBK到Unicode的转换,这时候,我们程序中的中文字串在javac后仍然是GBK码,而从数据库中读进的中文已经做过转换,也就是变成了Unicode码,当我们用java去运行时就会将中文的Unicode转换成ISO8859_1,自然要出错。这时,我们就需要自己将从数据库中读出的数据做一个Unicode到GBK的转换,因此就可以正常输出了。

2:在我们通过html页面向jsp或servlet发送字符串的时候同样会出现类似的问题。规律是:如果系统是西文语言环境,那么我们输入的中文可以正常输出。如果系统是中文语言环境,那么中文被做过处理。

3:与上述两种情况不同的是.jsp页面中的中文字符问题,jsp和servlet最大的不同点在于
jsp是只支持8位字符集的,这使得在没有任何设置的情况下jsp中直接写入的中文是不能正常显示的。必须要设置系统的编译环境,并且在显示中文的页面中加入contentType的设置才可以。

由于中文情况复杂,所以在我们进行业务操作的时候一个中文信息很可能会被系统给转
换很多次,从而导致信息失去应有的含义。所以我们在整个应用中遵守的原则是:不
管我接受到的实际数据如何,我所输出的结果一定是正确的。例如:客户从一个页面中输入个人信息(中文)并且提交给下一个确认页面,然后再进行确认。这个过程经历了两次数据传输,当我们使用request.getParameter()获得前一页面的数据的时候,很有可能这个数据被系统转换过,但无论系统转换与否,我们都需要保证本页面的输出是正确的。


|
用Stirng strOut = new String(strIn.getBytes(("ISO8859_1"),"GBK"); 试试。

|
直接用Stirng strOut=strIn试试!

|
还是不行……

|
是不是用了什么代理啊,关掉试试

|
String strOut = new String(strIn.getBytes("strIN的编码"),"你要输出字符串的编码"); 放在Applet中执行

|
在程序员杂志上,2001年的某一期,有这个问题的解决办法,你去看看。

|
在jsp文件的最头加上


|
byte bs[];
String ss = new String(bs);

    
 
 

您可能感兴趣的文章:

  • Java读写包括中文的txt文件时不同编码格式问题解决
  • 用java读中文linux中的文件是正确的,用java读英文linux版本中的文件是乱码,如何使英文linux读出的文件数据也是中文的?
  • 请教:关于英文,简体中文,繁体中文在JSP/JAVA中的整体解决方案!!!
  • 哪儿有较好的java中文资料与jbuilder的中文资料<我是一个新手>
  • 哪有java类库中文说明和jdk1.3.1的中文文档?
  • 请教:关于英文,简体中文,繁体中文在JSP/JAVA中的整体解决方案!!!!!
  • 在JAVA中如何将繁体中文和简体中文进行互相转换?
  • 在forte for java 4的Source Editor中编辑jsp时候,可以输入中文,可是保存后关闭再打开,中文显示???,怎么回事啊
  • Java简繁体中文互换 java-zhconverter
  • redhat7.3下,java程序打印中文直接用java命令执行正常,用crontab执行java命令为乱码
  • 请大家评价一下Thinking in Java第二版(中文)这本书如何,是否适合JAVA初学者?
  • 小弟我找到了一些JAVA认证模拟试题和JAVA中文FAQ,希望对大家有所帮助
  • Java国际化时怎么不能正确读取.properties文件中的中文字符串,如何解决其中的中文问题?
  • 请问哪里有java docs 的下载,中文版的,它是java的类库手册么?
  • 请问学习java比较好的中文书籍有哪些,谢谢!
  • 怎么是java程序支持中文?
  • 求解:为什么我写的Java程序不能显示中文。
  • 在实现简体中文转繁体中文,繁体中文转简体中文时,JAVA得如何实现???
  • 你认为最好的中文JAVA网站或有大量优秀JAVA源代码免费下载的网站是哪里???送分!!!
  • 请问:谁有中文的java1.3类库参考书???????????????
  • JAVA与中文问题???(中文出来就是乱码,换英文就正常)
  • 菜鸟的问题:java与java script 的异同??
  • java新手的问题,java高手帮忙...
  • 低级问题:.java文件交付用户怎么运行,难道也是DOS下:java xx.java?有没有.exe?
  • 请各位java高手几个java有关的问题?
  • java.sql.Date和java.uitl.Date的问题?
  • 问大哥大姐们个问题啊,小第编了自己的第一个JAVA问题。用JAVAC编译能通过啊!可是用JAVA不能执行啊!
  • 最入门级的java问题,如何运行HelloWorld.java
  • 请教一些JAVA的基本问题,初学JAVA有些迷糊,帮帮忙!总迷糊实在受不了了!
  • Linux下面的开发好的Java程序,如何部署到其他机器?开发好的Java图形程序,终端上能否用?等问题
  • 关于JAVA应用程序(Java Application)的deliver问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍
  • 我对JAVA一窍不通,可惜别人却给我一个Java的project,要我做一个安装程序,请问哪里有JAVA INSTALLER下载,而且我要不要安装java的sdk才能完成此项任务?
  • java命名空间java.security类keystore的类成员方法: getdefaulttype定义及介绍
  • 新年第一天,让我们讨论一下未来一年JAVA的发展趋势! 个人认为,JAVA将主要朝ERP和JAVA手机方面发展!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getclasspath定义及介绍
  • 我想学Java,但不知道Java的实用的开发工具有那些,Java主要用在哪些方面,EJB到底是什么东西??
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javaserializedobjectmimetype定义及介绍
  • 各位学java的朋友,学java的未来是什么,你们学java都用来开发什么项目啊!来者给分!!
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javafilelistflavor定义及介绍
  • 请问java程序中的import为什么有的用java.….*,而有的又用java.….…,有什么区别吗?
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getvmname定义及介绍
  • 简单说说Java SE、Java EE、Java ME三者之间的区别


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3