梦想 就像鸡蛋
要么孵化 要么臭掉
要么孵化 要么臭掉
繁简体(GB<=>Big5)字符串转化的JAVA方式实现
Made In Zeal 转载请保留原始链接:http://www.zeali.net/entry/19
本文提供一个java实现中文字符繁简体互换的zip包以及主要的源代码实现说明。
繁简体(GB<=>Big5)中文字符的转化实现原理很简单,就是根据两种码表的编码规则,创建两者之间的字符对应关系表,通过程序读取这个映射表来自动查出另一种编码方式下对应字符的字节编码,从而进行逐字节的内容替换。
主功能实现的GB2Big5.java源代码如下:
##############################
直接调用GB2Big5只适用于对于少量字符的转化,当需要对整个jsp页面根据用户需要进行编码转化
的时候,就需要使用到taglib的功能。
具体配置使用步骤如下:
1.在WEB-INF/目录下增加GB2Big5Wrapper.tld文件,内容如下:
2.在需要进行转化的JSP页面里面加上:
<%@ taglib uri="/WEB-INF/GB2Big5Wrapper.tld" prefix="zealLi"%>
<zealLi:GB2Big5Wrapper isbig5="true">
任何你需要转化的东西
</zealLi:GB2Big5Wrapper>
比如test.jsp源代码如下 =>
附件 GB2Big5.zip(108,182 bytes):
发布形式的类库zip文件,可直接使用
附件 GB2Big5_Project.zip(38,685 bytes):
JBuilder工程文件,提供完整的源代码
相关日志: PHP下中文编码各种格式间的转换类 , 中文字符编码格式判断
This Entry was Last Modified on 2007-05-24 16:30
发贴统计

我的地盘
LANG=zh_CN.GBK
或者在linux带参数重新编译。
http://www.zeali.net/blog/entry.php?id=5..
解决方法是将gb2big5.java中的big52gb(String inStr)函数中的
byte[] Text = new String(inStr.getBytes(),"BIG5").getBytes("BIG5");代码行改为
byte[] Text = inStr.getBytes("BIG5");
感谢zeal的无私奉献,如果有时间的话,可否麻烦你告诉我那两个码表从何处可以获得
预先表示感谢!!!另外,很好奇你是否身居港台?多嘴了
p.s. 我是上海嘀。
另外,你的StreamConverter类是为“从网络连接获得输入流然后转为字节数组”而写的吗?
因为我发现你特地对流堵塞情况进行了处理,不知道为何如此。
不过有一点疑问,input.available() != 0即使成立,
status = input.read(buffer)执行时在具备以下条件后也可能出现堵塞情况:
1,没有达到文件末尾
2,没足够的有效数据填满buffer
我是这样解决的,希望进一步交流
byte[] buffer=new byte[in.available()];
ByteArrayOutputStream bos=new ByteArrayOutputStream();
int byteNum=in.read(buffer);
while(byteNum!=-1){
bos.write(buffer,0,byteNum);
byteNum=in.read(buffer);
}
in.close();
byte[] sContent = bos.toByteArray();
bos.close();
最后,我也在上海,地球很小啊!
这个StreamConverter你猜得没错,最初确实是设计来读取URL的内容而写,属于我为公司开发架构编写的common library里面的一个util类。对于GB2Big5来说,其实只是用它来完成把输入字符流转化成字节数组。第一版的GB2Big5采用的是java.io.RandomAccessFile来完成文件读取,后来觉得要打jar包,把码表文件作为资源一起打进去,用io来读取并不通用,所以改成使用这个StreamConverter来转化通过getResourceAsStream得到的输入字符流。
由于历史原因,对于流堵塞进行的特殊处理是为了使用于多线程环境的网络数据读取。对于GB2Big5来说,你所提供的写法完全可以。
你的源代码让我明白了很多东西,谢谢你!
关于繁体转简体的问题,你的代码用于big5,我提供的代码行用于以GBK为内码的繁体。
以后可能还有很多问题要求助你,希望不吝赐教!
有没有什么解决方法?
“
gb->big5转换出来的并非big5码,在浏览器中是gbk繁体,而不是繁体BIG5
搞了很好,只有将gb码转成Unicode即在BIG5页面中处理转码问题。”
是怎么在BIG5页面中处理转码问题的才能转成繁体BIG5
附上 PHP 4 source 里面对于中文几种常用字符集的范围宏定义,你可以根据这个范围来实现自己的字符编码格式判断方法。
/* Support for Chinese(BIG5) characters */
#define isbig5head(c) (0xa1<=(uchar)(c) && (uchar)(c)<=0xf9)
#define isbig5tail(c) ((0x40<=(uchar)(c) && (uchar)(c)<=0x7e) || (0xa1<=(uchar)(c) && (uchar)(c)<=0xfe))
/* Support for Chinese(GB2312) characters */
#define isgb2312head(c) (0xa1<=(uchar)(c) && (uchar)(c)<=0xf7)
#define isgb2312tail(c) (0xa1<=(uchar)(c) && (uchar)(c)<=0xfe)
/* Support for Chinese(GBK) characters */
#define isgbkhead(c) (0x81<=(uchar)(c) && (uchar)(c)<=0xfe)
#define isgbktail(c) ((0x40<=(uchar)(c) && (uchar)(c)<=0x7e) || (0x80<=(uchar)(c) && (uchar)(c)<=0xfe))
String [中國] converted into:
[ ??]
多謝zeal !
PS:不好意思,本人脑袋不太好使,经常会转不过弯,希望您提点下!谢谢=v=
代码如下
String str5 = new String(GB2Big5.getInstance().big52gb("天天互動"),"GBK");
System.out.println(str5);
请赐教,谢谢
1,用到GBK的地方,我需要改成GB2312才能工作。
2,所有str.getBytes()方法,都没有传参数进去,这样会导致默认用系统的encoding,如此以来,如public byte[] gb2big5(String inStr)这个方法,如果在繁体系统下,会导致错误的转换,解决办法是,在此方法里面用str.getBytes("GB2312")来代替。其他str.getBytes()的方法也要指定相应的encoding,这样才能做到平台无关。
zeal,你好,我在繁体的系统中尝试运行你的程序,但是输出全都是?号,这是什么原因?两个table的问题吗?
我的这个方法可以解决你的问题
试过用resetGbChar()和resetBig5Char()方法好像没有效果
之前是用误用了,所以结果好像没有效
PS:如果想这个程序在繁体操作系统时生效的话最好指定一下编码
PS:帮到大忙了,太感谢zeal
(看过文件的日期与当前日期是一致的啊,理论上有进行过写入操作)
,没有调用时还是没效,难道每次都要调用一下reset方法来更新字符??