在Java中,GB码和Unicode码的互转问题,欢迎讨论
2007-05-09 16:58
344 查看
在Java中,编码格式非常重要,下面是一段GB码和Unicode码互转的代码,欢迎指出优缺点及需要改进的地方。
/**
* @author Administrator
*
*/
import java.io.*;
import java.util.Hashtable;
class GBUnicode{
byte high[]=new byte[6763],low[]=new byte[6763];
char unichar[]=new char[6763];
Hashtable UniGB;
public GBUnicode(String table_file)throws IOException
{
//BufferedInputStream tables=new BufferedInputStream (new FileInputStream(table_file));
DataInputStream tables=new DataInputStream (new FileInputStream(table_file));
int i,n=0;
byte b,bl,bh,num[]=new byte[20];
UniGB=new Hashtable(7000,1);
while (n<6763 ){
do{
bh=(byte)tables.read();
}while ((char)bh<=' '); //find first non-blank char
bl=(byte)tables.read();
high
=bh;
low
=bl;
do{
b=(byte)tables.read();
}while (b!=(byte)':'); //find ':'
do{
b=(byte)tables.read();
}while ((char)b<=' '); //find next non-blank char to read as number
i=0;
while ((char)b>='0' && (char)b<='9'){
num[i++]=b;
b=(byte)tables.read();
}
unichar
=(char)Integer.parseInt(new String(num,0,0,i));
if (UniGB.get(new Character(unichar
))!= null)
System.out.println("Duplicated : "+unichar
);
UniGB.put(new Character(unichar
),new Integer(n));
n=n+1;
}
tables.close();
}
private int getGBindex(byte high,byte low){
int i,j;
i=high-(byte)0xb0;
j=low-(byte)0xa1;
if (i <39) {// L1 Chinese
if (j<0 || j>94)
return -1;
return (i*94+j);
}
else if (i==39) {//one of the last 89 L1 Chinese
if (j<0 || j>89)
return -1;
return (i*94+j);
}
else {//L2 Chinese
if (j<0 || j>94)
return -1;
return (i*94+j-5);
}
}
public byte[] Uni2GB(char unicode) {
Integer index=(Integer)UniGB.get(new Character(unicode));
if (index==null)
return null;
byte ch[]=new byte[2];
ch[0]=high[index.intValue()];
ch[1]=low[index.intValue()];
return ch;
}
public char GB2Uni(byte high, byte low) {
int index=getGBindex(high,low);
if (index ==-1) //not GB Chinese
return 0;
return(unichar[index]);
}
}
/**
* @author Administrator
*
*/
import java.io.*;
import java.util.Hashtable;
class GBUnicode{
byte high[]=new byte[6763],low[]=new byte[6763];
char unichar[]=new char[6763];
Hashtable UniGB;
public GBUnicode(String table_file)throws IOException
{
//BufferedInputStream tables=new BufferedInputStream (new FileInputStream(table_file));
DataInputStream tables=new DataInputStream (new FileInputStream(table_file));
int i,n=0;
byte b,bl,bh,num[]=new byte[20];
UniGB=new Hashtable(7000,1);
while (n<6763 ){
do{
bh=(byte)tables.read();
}while ((char)bh<=' '); //find first non-blank char
bl=(byte)tables.read();
high
=bh;
low
=bl;
do{
b=(byte)tables.read();
}while (b!=(byte)':'); //find ':'
do{
b=(byte)tables.read();
}while ((char)b<=' '); //find next non-blank char to read as number
i=0;
while ((char)b>='0' && (char)b<='9'){
num[i++]=b;
b=(byte)tables.read();
}
unichar
=(char)Integer.parseInt(new String(num,0,0,i));
if (UniGB.get(new Character(unichar
))!= null)
System.out.println("Duplicated : "+unichar
);
UniGB.put(new Character(unichar
),new Integer(n));
n=n+1;
}
tables.close();
}
private int getGBindex(byte high,byte low){
int i,j;
i=high-(byte)0xb0;
j=low-(byte)0xa1;
if (i <39) {// L1 Chinese
if (j<0 || j>94)
return -1;
return (i*94+j);
}
else if (i==39) {//one of the last 89 L1 Chinese
if (j<0 || j>89)
return -1;
return (i*94+j);
}
else {//L2 Chinese
if (j<0 || j>94)
return -1;
return (i*94+j-5);
}
}
public byte[] Uni2GB(char unicode) {
Integer index=(Integer)UniGB.get(new Character(unicode));
if (index==null)
return null;
byte ch[]=new byte[2];
ch[0]=high[index.intValue()];
ch[1]=low[index.intValue()];
return ch;
}
public char GB2Uni(byte high, byte low) {
int index=getGBindex(high,low);
if (index ==-1) //not GB Chinese
return 0;
return(unichar[index]);
}
}
相关文章推荐
- java InputStream 关于read阻塞的问题讨论
- 把遇到过的对.Net线程的一些问题和误解集中起来和大家分享,也希望大家能一起补充,热烈欢迎讨论(转)
- 建了一个"symbina 技术"邮件列表,欢迎大加入到这个群,讨论symbian C++相关的技术问题!
- java程序员跟C++程序员讨论"格林威治标准时间”的转换问题的真实故事之感悟
- solr中一个问题——顺便讨论java中关于中包括main函数以及涉及资源(变量)操作中的类
- Java 安全:讨论Ajax安全问题不容忽视
- 简单的java聊天室,出了点问题,欢迎帮忙,哈哈
- 1024 瓷砖问题再讨论(java)
- 欢迎讨论问题
- java InputStream 关于read阻塞的问题讨论
- JAVA将UNICODE码转成中文遇到的问题
- 怎样优化GDI+?怎样解决WindowsForm程序的闪烁问题 欢迎大家讨论!
- java截取字符串的几种方法的总结,欢迎提出问题
- Android4.4中Email打开网页URL问题-欢迎大家来讨论
- Top k问题的讨论(三种方法的java实现及适用范围)
- java 异常的问题讨论
- Java参数传递过程中 传形参和传引用问题讨论
- java面试常问的问题,欢迎补充
- Top k问题的讨论(三种方法的java实现及适用范围)
- 从其他地方移来的Java面题,欢迎讨论……