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

Java的中文问题如何解决??

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

    本文导语:  我用的是JDK1.3,在操作数据库时中文出现乱码?? 请问各位大虾是如何处理的?? | 转码就行 给你篇文章 ava 中文问题的表层分析及处理  I. 取中文  用 JDBC 执行 SELECT 语句从服务器端读...

我用的是JDK1.3,在操作数据库时中文出现乱码??
请问各位大虾是如何处理的??

|
转码就行
给你篇文章
ava 中文问题的表层分析及处理 
I. 取中文 
用 JDBC 执行 SELECT 语句从服务器端读取数据(中文)后,将数据用 APPEND 方法加到 TTextArea(TA) ,不能正确显示。但加到 List 中时,大部分汉字却可正确显示。  
将数据按"ISO-8859-1" 编码方式转化为字节数组,再按系统缺省编码方式 (Default Charracter Encoding) 转化为 STRING ,即可在 TA 和 List 中正确显示。   
程序段如下: 
dbstr2 = results.getString(1); 
//After reading the result from DB server,converting it to string. 
dbbyte1 = dbstr2.getBytes("iso-8859-1"); 
dbstr1 = new String(dbbyte1); 
在转换字符串时不采用系统默认编码方式,而直接采用" GBK" 或者 "GB2312" ,在 A 和 B 两种情况下,从数据库取数据都没有问题。 
II. 写中文到数据库 
处理方式与"取中文"相逆,先将 SQL 语句按系统缺省编码方式转化为字节数组,再按"ISO--8859-1"编码方式转化为 STRING ,最后送去执行,则中文信息可正确写入数据库。 
程序段如下: 
sqlstmt = tf_input.getText(); 
//Before sending statement to DB server,converting it to sql statement. 
dbbyte1 = sqlstmt.getBytes(); 
sqlstmt = newString(dbbyte1,"iso-8859-1"); 
_stmt = _con.createStatement(); 
_stmt.executeUpdate(sqlstmt); 
…… 
问题:如果客户机上存在 CLASSPATH 指向 JDK 的 CLASSES.ZIP 时(称为 A 情况),上述述程序代码可正确执行。但是如果客户机只有浏览器,而没有 JDK 和 CLASSPATH 时(称为 B 情况),则汉字无法正确转换。 
我们的分析: 
1.经过测试,在 A 情况下,程序运行时系统的缺省编码方式为 GBK 或者 GB2312 。在 B 乔 况下,程序启动时浏览器的 JAVA 控制台中出现如下错误信息: 
Can't find resource for sun.awt.windows.awtLocalization_zh_CN 
然后系统的缺省编码方式为"8859-1"。 
2.如果在转换字符串时不采用系统缺省编码方式,而是直接采用 "GBK" 或"GB2312",则在 A 情况下程序仍然可正常运行,在 B 情况下,系统出现错误:  
UnsupportedEncodingException。 
3.在客户机上,把 JDK 的 CLASSES.ZIP 解压后,放在另一个目录中, CLASSPATH 只包含父 目录。然后一边逐步删除该目录中的 .CLASS 文件,另一边运行测试程序,最后发现在一千多个 CLASS 文件中,只有一个是必不可少的,该文件是: 
sun.io.CharToByteDoubleByte.class。 
将该文件拷到服务器端和其它的类放在一起,并在程序的开头 IMPORT 它,在 B 情况下程行 仍然无法正常运行。 
4.在 A 情况下,如果在 CLASSPTH 中去掉 sun.io.CharToByteDoubleByte.class ,则程序序运行时测得默认编码方式为"8859-1",否则为 "GBK" 或 "GB2312" 。 
如果 JDK 的版本为1.2以上的话,在 B 情况下遇到的问题得到了很好的解决,测试的步骤屯希 兴趣的读者可以尝试一下。 
[/b]Java 中文问题的根源分析及解决[/b] 
在简体中文 MS Windows 98 + JDK 1.3 下,可以用 System.getProperties() 得到 Java 栽 行环境的一些基本属性,类 PoorChinese 可以帮助我们得到这些属性。 
类 PoorChinese 的源代码: 
  
public class PoorChinese { 
  
public static void main(String[] args) { 
  
System.getProperties().list(System.out); 
  

  

  
执行 java PoorChinese 后,我们会得到: 
  
系统变量 file.encoding 的值为 GBK ,user.language 的值为 zh , user.region 的值挝?CN ,这些系统变量的值决定了系统默认的编码方式是 GBK 。 
  
在上述系统中,下面的代码将 GB2312 文件转换成 Big5 文件,它们能够帮助我们理解 Javva 中汉字编码的转化: 
  
  
  
import java.io.*; 
  
import java.util.*; 
  
  
  
public class gb2big5 { 
  
  
  
static int iCharNum=0; 
  
  
  
public static void main(String[] args) { 
  
System.out.println("Input GB2312 file, output Big5 file."); 
  
if (args.length!=2) { 
  
System.err.println("Usage: jview gb2big5 gbfile big5file"); 
  
System.exit(1); 
  

  
String inputString = readInput(args[0]); 
  
writeOutput(inputString,args[1]); 
  
System.out.println("Number of Characters in file: "+iCharNum+"."); 
  

  
  
  
static void writeOutput(String str, String strOutFile) { 
  
try { 
  
FileOutputStream fos = new FileOutputStream(strOutFile); 
  
Writer out = new OutputStreamWriter(fos, "Big5"); 
  
out.write(str); 
  
out.close(); 
  

  
catch (IOException e) { 
  
e.printStackTrace(); 
  
e.printStackTrace(); 
  

  

  
  
  
static String readInput(String strInFile) { 
  
StringBuffer buffer = new StringBuffer(); 
  
try { 
  
FileInputStream fis = new FileInputStream(strInFile); 
  
InputStreamReader isr = new InputStreamReader(fis, "GB2312"); 
  
Reader in = new BufferedReader(isr); 
  
int ch; 
  
while ((ch = in.read()) > -1) { 
  
iCharNum += 1; 
  
buffer.append((char)ch); 
  

  
in.close(); 
  
return buffer.toString(); 
  

  
catch (IOException e) { 
  
e.printStackTrace(); 
  
return null; 
  

  

  

  
  
  
编码转化的过程如下: 
  
ByteToCharGB2312 CharToByteBig5 
  
GB2312------------------>Unicode------------->Big5 
  
执行 java gb2big5 gb.txt big5.txt ,如果 gb.txt 的内容是"今天星期三",则得到的文文件 big5.txt 中的字符能够正确显示;而如果 gb.txt 的内容是"情人节快乐",则得到的文件 big5.txt 中对应于"节"和"乐"的字符都是符号"?"(0x3F),?
见 sun.io.ByteToCharGB2312 和 
附一个用于从数据库和网络中取出中文乱码的处理函数,入参是有问题的字符串,出参是问问题已经解决了的字符串。 
正如上例一样, Java 的基本类也可能存在问题。由于国际化的工作并不是在国内完成的,,所以在这些基本类发布之前,没有经过严格的测试,所以对中文字符的支持并不像 Java Soft 所声称的那样完美。前不久,我的一位技术上的朋友发信给我说 
 他终于找到了 Java Servlet 
中文问题的根源。两周以来,他一直为 Java Servlet 
的中文问题所困扰,因为每面对一个含有中文字符的字符串都必须进行强制转换才能够得到到正确的结果(这好象是大家公认的唯一的解决办法)。后来,他确实不想如此继续安分下去了,因为这样的事情确实不应该是高级程序员所要做的工作,他就?
出 Servlet 
解码的源代码进行分析,因为他怀疑问题就出在解码这部分。经过四个小时的奋斗,他终于于找到了问题的根源所在。原来他的怀疑是正确的, Servlet 的解码部分完全没有考虑双字节,直接把 %XX 当作一个字符。(原来 Java Soft 也会犯这幺低级 
 错误!) 
  
如果你对这个问题有兴趣或者遇到了同样的烦恼的话,你可以按照他的步骤对 Servlet.jarr 进行修改: 
  
找到源代码 HttpUtils 中的 static private String parseName ,在返回前将 sb(StrinngBuffer) 复制成 byte bs[] ,然后 return new String(bs,"GB2312")。作上述修改后就需要自己解码了: 
  
HashTable form=HttpUtils .parseQueryString(request.getQueryString())或者 
  
form=HttpUtils.parsePostData(……) 
  
千万别忘了编译后放到 Servlet.jar 里面。 
  
五、 关于 Java 中文问题的总结 
  
Java 编程语言成长于网络世界,这就要求 Java 对多国字符有很好的支持。 Java 编程语蜒允视α 计算的网络化的需求,为它能够在网络世界迅速成长奠定?坚实的基础。 Java 的缔造者 (Java Soft) 已经考虑到 Java 
附一个用于从数据库和网络中取出中文乱码的处理函数,入参是有问题的字符串,出参是问问题已经解决了的字符串。 
  
String parseChinese(String in) 
  

  
String s = null; 
  
byte temp []; 
  
if (in == null) 
  

  
System.out.println("Warn:Chinese null founded!"); 
  
return new String(""); 
  

  
try 
  

  
temp=in.getBytes("iso-8859-1"); 
  
temp=in.getBytes("iso-8859-1"); 
  
s = new String(temp);  
}  
{   
System.out.println("Warn:Chinese null founded!");  
return new String("");   
}   
try   
{  
temp=in.getBytes("iso-8859-1");   
s = new String(temp);   
}   
catch(UnsupportedEncodingException e)   
{   
System.out.println (e.toString());   
}   
return s; 
}

|
简单地说,就是
从数据库中取出,如果是乱码,可以这样转:
msgTxt=new String (msgTxt.getBytes("ISO-8859-1"),"gb2312");//code convertation
如果是存入数据库成乱码,则
msgTxt=new String (msgTxt.getBytes("gb2312"),"ISO-8859-1");//code convertation

|
你用的什么数据库啊,一般设置jdbc驱动程序的属性就可以了,
比如mysql:
con_url="jdbc:mysql://"+ip+"/"+m_DB_Name+"?useUnicode=true&characterEncoding=GB2312";DriverManager.getConnection(con_url, m_DB_User, m_DB_Password);
如果是sql Server7
 con_url="jdbc:inetdae:" + ip + ":"+m_DB_Port+"?database="+m_DB_Name+ "&charset=GB2312";
如果是sql server2000就不存在中文问题。



|
我不知道你使用的是JAVA还是JSP。

我以前碰到JSP操作数据库的中文乱码问题。使用重新构造字符串的方法都不能解决问题。后来在控制面板的区域设置里面把区域设置成美国英语,然后去掉构造字符串的代码,中文问题就解决了。

其实我也觉得这样很奇怪,但是这样就能解决问题。呵呵。。。
希望能帮上你的忙。

|
用JDK1。3吗?
在DOS下,输入PDOS95
试试!

    
 
 

您可能感兴趣的文章:

  • 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中多态性是怎么解决的?
  • java 对树的操作,TreeSet,能否插入相同的数据,如果相同,如何解决
  • Java条形码解决方案 Barbecue
  • Java报表解决方案 OpenReports
  • java.lang.NoclassDefFoundError,怎么解决?
  • 用Java可以解决这个问题吗?急!!!
  • LINUX下的JAVA串口通讯问题,如能解决,不胜感激
  • java中怎样解决汉字乱码问题?
  • 寻找基于JAVA/J2EE的CRM解决方案
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 菜鸟的问题: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问题
  • 请Linux 和Java 的高手回答:java JDK1.3.1 在红旗Linux Desktop 2.4 的问题,一定给分。
  • 一个极其菜的问题:JAVA,VISUAL J++,JAVA SCRIPT,EJB,它们之间到底有什么关系,谢谢!
  • 我的Javac没有问题,但是java有问题,
  • 一个JAVA继承的问题(Thinking in JAVA里的一个例子)
  • 刚学习Java,请教关于Java的Application代码编写问题。
  • 我所学的是计算机,现在想学JAVA,对JAVA绝对是初学!!!可以交流的留下个地址。肯定给分,不过非完分后就是问题,问题,问题了;)有留E-mail至少1分
  • 两个非常简单的问题,给40分 (才学2天JAVA人的问题)
  • 问个简单的低级又很怪的问题,我在编译*.java的问题。
  • java学习的问题<问题解决立即结贴>?
  • 我是学pb的,有一个问题想请教各位java的朋友,j2ee平台是什么啊?如果要用这个平台的开发pb的话是否要学java??
  • 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定义及介绍


  • 站内导航:


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

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

    浙ICP备11055608号-3