发信人: 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]
|
|