梦想 就像鸡蛋
要么孵化 要么臭掉
要么孵化 要么臭掉
繁简体(GB<=>Big5)字符串转化的JAVA方式实现
本文提供一个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
ac米兰 ajax apache api blog blogchina browser cctv classpath css download dreamhost dvd encoding error firefox flash framework gmail google google_analytics google_talk http ide ie ie7 javascript jquery linux maxthon mod_rewrite movies mvc mysql oracle php pivot prototype rss shell socket sohu spammers svn vs web web2 webclient weblogic windows xsl zend 阿根廷 安全漏洞 奥运 备份 变形金刚 程序员 地铁 浮动层 父亲 搞笑 工具 冠军杯 管理 火箭 进程 客户端 篮球 厉 命令行 欧洲杯 人生 日志分析 设计模式 世界杯 数据库 搜索引擎 算法 图片 无极 系统优化 笑话 姚明 游戏 源代码 周杰伦 字符编码 足球 浏览器

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方法来更新字符??
如果你用的是zip包的话,需要自己把包解开之后运行reset写入码表之后在把新生成的table文件打包回去。
zip里面没有r发现eset,不知道是怎么回事?还有就是想请教一下,如果utf8与Big5简繁相互转换,该如何处理?谢谢
请参阅之前其他人的回复。在类里面有resetGbChar和resetBig5Char两个方法。
new String(oldStr.getBytes(),"UTF-8").getBytes("UTF-8");
就得到了utf-8编码的字节流。
new String(inStr.getBytes(), "UTF-8").getBytes("UTF-8"),
得到的是如:
[这里] ---->[錕斤拷錕斤]
这是什么原因呢?,我的操作过程是这样的:
读取文本文件,然后转换成简体或者繁体字。
谢谢zeal。请问,但是GB->BIG5似乎不对?BIG5在简体系统中应该显示乱码,中国两个字转换为big5不应该是い瓣吗?而您的程序转换出的是中國。这两字在繁体系统中仍旧是乱码呀!?
PS:不好意思,本人脑袋不太好使,经常会转不过弯,希望您提点下!谢谢=v=
- zeal (link) 于 2007-01-16 16:06
这是测试代码为了显示出来便于观察,在显示的时候又通过java getBytes 把 big5 的字符串转化成 统一的 java unicode 之后再显示了出来。你在实际使用的时候直接把字节数组写入文件或输出,不要再进行转化就可以了。
--------------------------------------------------------
请教zeal,这里该如何处理,我现在遇到和这个一样的问题,谢谢你的指教!比较急。
"拉"
"べ"
"じ稨"
"じ繟バ"
"瑌"
"拉瓁"
"べ屡"
"じ狶"
"瓾狶"
"じ秏"
在繁体系统里面都能显示繁体字,而我现在要处理的就是要把像这样的编码转换陈简体中文,该怎么处理呢?我参见了上面的恢复,还不清楚如何处理,希望你能指点一下,非常谢谢!
java.io.FileNotFoundException: orgrelyangutilgb-big5.table (系统找不到指定的路径。)
请问为何打不开码表文件??请问这是什么问题啊?
出现异常。我用来更新好多香港字都出现这个问题,是怎么回事啊??谢谢!
一个referer来源里面有以上的链接,可以取得关键字,可是无法将关键字转换为对应的编码,虽然百度是gb2312编码,可是如果输入繁体的字符搜索,这个时候用UrlDecode.decode(wd,"gb2312")解码出来的字符就是乱码。
这个里面的wd搜索关键字,有可能是繁体的,有可能是简体,还有可能是其他的字符,如何取得wd的对应编码呢?
但是我要求的可能还有google.com,yahoo。tw等其他搜索引擎也支持,google就是utf-8,能否有一个程序来的判断是什么编码呢?
就像流量统计,是怎么解决各种关键字不显示成乱码呢
但是,由于tlkeditR13b采用的是GPL协议,我必须公开tlkeditR13b修改后的代码,我的想法是直接将修改后的版本寄回tlkeditR13b的作者,由他(她)本人决定是否接受代码。
但是,同时寄回的还有你的简繁转化代码以及通过Eclipse生成的Jar文件,而简繁转化代码没有附带版权说明,所以请问,您是否允许我这样做?谢谢!