简繁体转换方案(Unicode版)
目前很多网站需要把箭体转成繁体或反之,但是大部分解决方案都是提供GB-BIG5的方案,而Unicode-Unicode的解决方案却很少,实现Unicode-Unicode方案有很多好处,其中最大的好处在于,不需要为显示发愁,只要编码是Unicode那么你的程序在全世界都是通用的,不会出现乱码问题。这个方案的核心很简单就是查找替换,将映射表放入内存,有符合条件的就替换,因为时间比较短,可能字库不全,请大家多多包含,另外请大家回复一下,因为csdn不允许连续回复,我的字库可能要很长时间此才能贴完。
另如果大家还有什么好的解决办法请和我联系,我的msn : K_Qu2000@hotmail.com。还有据我所知GB12345-80编码可以找到简繁体对应关系,可是我找不到有关这个方案的详细资料,而且我用的JDK1.3.1不支持,但是我在JDK1.4.2的文档中看到它。
其他说明:两个映射表文件(GB2BIGMapping.txt,BIG2GBMapping.txt,请注意这两个文件必须是UTF-8编码的)请放在C;\\UnicodeLib\\下;
如果要实现GB-Unicode或BIG5-Unicode的转换,只要在输入时进行设定就可以了。
源文件:UnicodeConvert.java
import java.util.Hashtable;
import java.util.Enumeration;
import java.io.*;
import java.net.URL;
public class UnicodeConvert {
public static Hashtable S2T = null;
public static Hashtable T2S = null;
/**
* 构造器
* 如果静态表已存在,就使用以前的,如果不存在载入新的
*/
public UnicodeConvert() {
if (UnicodeConvert.S2T==null||UnicodeConvert.T2S==null) {
this.load();
}
}
/**
* 载入映射表,放入T2S和S2T两个Hashtable中
* 映射表为C:\\UnicodeLib\\GB2BIGMapping.txt (简-繁)
* C:\\UnicodeLib\\BIG2GBMapping.txt (繁-简)
* 请注意这两个文件的编码必须是UTF-8
* 如果出现异常,将载入失败,部分或全部映射表没有载入,
* 这时进行转换不会报错,但是部分或全部字符不会转换。
*/
private void load() {
S2T = new Hashtable();
T2S = new Hashtable();
File gbFile = new File("C:\\UnicodeLib\\GB2BIGMapping.txt");
File big5File = new File("C:\\UnicodeLib\\BIG2GBMapping.txt");
if (!gbFile.isFile()||!big5File.isFile()) {
return;
}
try {
FileInputStream os = new FileInputStream(gbFile);
BufferedReader dis = new BufferedReader(new InputStreamReader(os,"UTF-8"));
String line = null;
while ((line=dis.readLine())!=null) {
if (!line.equals("")) {
char[] ou = line.toCharArray();
S2T.put(new Character(ou[0]),new Character(ou[1]));
}
}
dis.close();
FileInputStream os2 = new FileInputStream(big5File);
BufferedReader dis2 = new BufferedReader(new InputStreamReader(os2,"UTF-8"));
String line2 = null;
while ((line2=dis2.readLine())!=null) {
if (!line2.equals("")) {
char[] ou = line2.toCharArray();
T2S.put(new Character(ou[0]),new Character(ou[1]));
}
}
dis2.close();
}
catch (IOException ex) {
ex.printStackTrace();
}
}
/**
* 简体转换为繁体
*
* @param cont 要转换的字符串
*
* @return 转换后的字符串
*
* 例如:
* UnicodeConvert test = new UnicodeConvert();
* String out = test.convertS2T("张几芸莜");
*
* 结果为:張幾芸蓧
*/
public String convertS2T(String cont) {
if (UnicodeConvert.S2T==null) {
this.load();
}
int len = cont.length();
char[] list = cont.toCharArray();
for (int i=0;i<len;i++) {
Character ca = new Character(list[i]);
if (this.S2T.containsKey(ca)) {
list[i] = ((Character)this.S2T.get(ca)).charValue();
}
}
return String.valueOf(list);
}
/**
* 繁体转换为简体
*
* @param cont 要转换的字符串
*
* @return 转换后的字符串
*
* 例如:
* UnicodeConvert test = new UnicodeConvert();
* String out = test.convertS2T("張幾芸蓧");
*
* 结果为:张几芸莜
*/
public String convertT2S(String cont) {
if (UnicodeConvert.T2S==null) {
this.load();
}
int len = cont.length();
char[] list = cont.toCharArray();
for (int i=0;i<len;i++) {
Character ca = new Character(list[i]);
if (this.T2S.containsKey(ca)) {
list[i] = ((Character)this.T2S.get(ca)).charValue();
}
}
return String.valueOf(list);
}