CTOCIO IT专家网

天极传媒 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
IT专家网搜索

您现在的位置: IT专家网 > Web服务子站 > Java技术

Java 编程技术中汉字问题的分析及解决

作者: 佚名,  出处:IT专家网论坛, 责任编辑: 包春林, 
2008-08-07 04:00
  在基于 Java 语言的编程中,我们经常碰到汉字的处理及显示的问题。一大堆看不懂的乱码肯定不是我们愿意看到的显示效果,怎样才能够让那些汉字正确显示呢?

  我们的分析:

  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 情况下遇到的问题得到了很好的解决,测试的步骤同上,有兴趣的读者可以尝试一下。

  Java 中文问题的根源分析及解决

  在简体中文 MS Windows 98 + JDK 1.3 下,可以用 System.getProperties() 得到 Java 运行环境的一些基本属性,类 PoorChinese 可以帮助我们得到这些属性。

  类 PoorChinese 的源代码:

  

      public class PoorChinese {   }
  执行 java PoorChinese 后,我们会得到:

  系统变量 file.encoding 的值为 GBK ,user.language 的值为 zh , user.region 的值为 CN ,这些系统变量的值决定了系统默认的编码方式是 GBK 。

  在上述系统中,下面的代码将 GB2312 文件转换成 Big5 文件,它们能够帮助我们理解 Java 中汉字编码的转化:

  

      ?

  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;

  }

  }

  }

  ?

共4页。 9 1 2 3 4 :

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。
  • 周排行榜
  • 月排行榜

邮件订阅

       
天极服务 | 关于我们 | 网站律师 | 加入我们 | 联系我们 | 广告业务 | 友情链接 | 我要挑错
All Rights Reserved, Copyright 2004-2008, Ctocio.com.cn
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i