精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Java>>JAVA编程>>中文问题>>Java中文问题(参考1)

主题:Java中文问题(参考1)
发信人: head()
整理人: hht(1999-03-11 11:08:23), 站内信件
From:
                                                                       12:59
Subject: [中文Q&A]Java Unicode 与 Big5 转码 Package-本站特藏
To: [email protected]

From:      [email protected] via BBS mail gateway
Subject:   [中文Q&A]Java Unicode 与 Big5 转码 Package-本站特藏
Date:      Tue Jun  9 12:59:46 1998
To:        To

rom - Fri Aug 01 16:16:37 1997
Path: netnews.ntu.edu.tw!spring.edu.tw!News.csie.ncu.edu.tw!news.ncu.edu.tw!news.yzit.edu.tw!aidebbs.edu.tw!netnews.csie.nctu.edu.tw!news.csie.nctu.edu.tw!phoenix
From: [email protected] (duke :>)
Newsgroups: tw.bbs.comp.lang.java
Subject: Java Unicode 与 Big5 转码 Package
Date: 1 Aug 1997 07:33:51 GMT
Organization: 交大资工凤凰城资讯站
Message-ID: <[email protected]>
X-Filename: java/M.870420831.A
NNTP-Posting-Host: serv.hinet.net
Lines: 241

 首先感谢:
 EightCloud@phoenix (岚云) 於 Mon Jun  2 15:11:22 1997 张贴
 Re: applet後, 中文字都不见了? (回覆 [email protected])
 - 使用 Microsoft Java VM 提供的转码机制

 [email protected] (Victor) 於 Thu Jun 12 23:05:39 1997 张贴
 [Announce] JDBC driver 中文转码类别 (暨大俞旭升老师所提供的解法)
 - 使用 JDK 1.1 所提供『纯 Java 』转码 Package (sun.io.*)

 在这里公布的 Package(StringConverter.java) 可在 MSIE 与 JDK 1.1 (Hot-
 Java 可能可) 担任字串转码的动作 (Unicode -> Big5 或 Big5 -> Unicode),
 至於 Netscape 的浏览器可修改 JDK 1.1 里头的 Package 解决。

 效率问题请自行斟酌 :-)

 使用 JDK 1.1 编译 Package 与测试用 Java Application (TestStrApp.java)
 [两个程式附在文章末]

D:\p\works\str>javac *.java
Note: 2 files use deprecated APIs.  Recompile with "-deprecation" for
details.
1 warning

D:\p\works\str>java TestStrApp
Unicode(3): 大家好 - 5927 5bb6 597d
Java
Native(6): ?j?a?n - 00a4 006a 00ae 0061 00a6 006e
Java
Unicode(3): 大家好 - 5927 5bb6 597d
Java

D:\p\works\str>jview TestStrApp
Unicode(3): 大家好 - 5927 5bb6 597d
Microsoft
Native(6): ?jRa|n - 00a4 006a 00ae 0061 00a6 006e
Microsoft
Unicode(3): 大家好 - 5927 5bb6 597d
Microsoft

 使原始档编译产生的是 Big5 ...

D:\p\works\str>javac -encoding 8859_1 TestStrApp.java

D:\p\works\str>java TestStrApp
Native(6): ?j?a?n - 00a4 006a 00ae 0061 00a6 006e
Java
Unicode(3): 大家好 - 5927 5bb6 597d
Java
Native(6): ?j?a?n - 00a4 006a 00ae 0061 00a6 006e
Java

D:\p\works\str>jview TestStrApp
Native(6): ?jRa|n - 00a4 006a 00ae 0061 00a6 006e
Microsoft
Unicode(3): 大家好 - 5927 5bb6 597d
Microsoft
Native(6): ?jRa|n - 00a4 006a 00ae 0061 00a6 006e
Microsoft

 在测试 Browser 时, 发现中文版的 Netscape Navigator 3.0 for Win32 是
 Big5 与 Unicode 通吃的 (系指 Java Applet)。

=[StringConverter.java]=begin=========================================
import java.io.DataInputStream;
import java.io.ByteArrayInputStream;

import java.io.DataOutputStream;
import java.io.ByteArrayOutputStream;

import sun.io.*;

public class StringConverter {
 public static boolean canConvertToNative(char c)
 {
  if (c > 0xff) {
   return true;
  } else {
   return false;
  }
 }

 public static boolean isNative(char c)
 {
  return !canConvertToNative(c);
 }

 public static boolean isUnicode(char c)
 {
  return canConvertToNative(c);
 }

 public static byte[] toNative_java(String s)
 throws Exception
 {
  CharToByteConverter toByte =
   CharToByteConverter.getConverter("Big5");
  return toByte.convertAll(s.toCharArray());
 }

 public static char[] toUnicode_java(byte[] b)
 throws Exception
 {
  ByteToCharConverter CharConverter =
   ByteToCharConverter.getConverter("Big5");
  return CharConverter.convertAll(b);
 }

 public static String toNative(String s) {
  byte[] sour;
  try {
   DataOutputStream      m_data_out_s=null;
   ByteArrayOutputStream ba_out_s = new ByteArrayOutputStream();
   m_data_out_s=(DataOutputStream)Runtime.getRuntime().
   getLocalizedOutputStream(ba_out_s);
   System.err.println("Microsoft");
   try {
    m_data_out_s.writeChars(s);
    sour = ba_out_s.toByteArray();
   } catch (java.io.IOException e) {
    System.err.println("Unicode convert to Native failure(MS): "+e);
    return s;
   }
  } catch (ClassCastException ee) {
   System.err.println("Java");
   try {
    sour = toNative_java(s);
   } catch (Exception e) {
    System.err.println("Unicode convert to Native failure(Java): "+e);
    return s;
   }
  }
  char[] dest = new char[sour.length];
  for (int i=0; i < sour.length; i++)
dest[i] = (char)(sour[i] & 0xFF);
return new String(dest);
}

public static String toUnicode(String s) {
int i, j;
char[] sour = s.toCharArray();
byte[] dest = new byte[sour.length];
for (i=0; i < sour.length; i++)
dest[i] = (byte) (sour[i]&0xFF);
try {
DataInputStream m_data_in_s=null;
ByteArrayInputStream ba_in_s = new ByteArrayInputStream(dest);
m_data_in_s=(DataInputStream)Runtime.getRuntime().
getLocalizedInputStream(ba_in_s);
System.err.println("Microsoft");
try {
String ss=m_data_in_s.readLine();
return ss;
} catch (java.io.IOException e) {
System.err.println("Native convert to Unicode failure(MS): "+e);
return s;
}
} catch (ClassCastException ee) {
System.err.println("Java");
try {
return new String(toUnicode_java(dest));
} catch (Exception e) {
System.err.println("Native convert to Unicode failure(Java): "+e);
return s;
}
}
}
}
=[StringConverter.java]=end===========================================

=[TestStrApp.java]=begin==============================================
class TestStr {
String showStr;
String orgStr=new String("大家好");

static boolean fUnicode = true;
static boolean fNative = false;

public String printHex(char cc) {
int d1 = cc % 16;
int d2 = ( cc / (16) ) % 16;
int d3 = ( cc / (16 * 16) ) % 16;
int d4 = ( cc / (16 * 16 * 16) ) % 16;
StringBuffer sb = new StringBuffer();
sb.append(Integer.toHexString(d4));
sb.append(Integer.toHexString(d3));
sb.append(Integer.toHexString(d2));
sb.append(Integer.toHexString(d1));
return sb.toString();
}

public boolean printStr(String str) {
int ll = str.length();
boolean is_unicode = false;

if (StringConverter.isUnicode(str.charAt(0)) ) {
System.out.print("Unicode");
is_unicode = fUnicode;
} else {
System.out.print("Native");
is_unicode = fNative;
}

System.out.print("(");
System.out.print(ll);
System.out.print("): ");

System.out.print(str);
System.out.print(" - ");

char[] cc = new char[ll];
str.getChars(0, ll, cc, 0);
for(int ii=0; ii < ll; ii++) {
System.out.print( printHex(cc[ii]) );
if (ii != ll-1) System.out.print(" ");
}
System.out.println();
return is_unicode;
}

public void init() {
showStr = orgStr;

for (int i=0; i<3; i++)
if (printStr(showStr) == fUnicode)
showStr=StringConverter.toNative(showStr);
else
showStr=StringConverter.toUnicode(showStr);
}
}

public class TestStrApp {
public static void main(String argv[]) {
TestStr t=new TestStr();
t.init();
}
}
=[TestStrApp.java]=end================================================

- The end

--
☆ 来源:.广州网易BBS站 bbs.nease.net.[FROM: 202.101.127.250]

[关闭][返回]