免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8659 | 回复: 17
打印 上一主题 下一主题

如何在utf8字符里判断gbk或big5编码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-02 18:16 |只看该作者 |倒序浏览
  1. 汉字無法abc
复制代码


在utf-8里,各种字符混合,如何分别判断每一个字符是属于big5还是gb还是英文等等。。。
完全没思路啊,晕倒。。。
请有utf-8下汉字判断经验的朋友说一下,谢谢了!

补充:
主要问题是这样的,网页是utf-8编码,但数据库统一为big5编码,
所以,所有在utf-8页面提交后的数据必需转换为big5码再保存,
问题出现了,提交的数据由于可能是简体中文也可能是繁体中文,或者是它们的混合。
有些文字可以直接用
#utf8 -> big5

$text= encode("big5",decode("utf8",$text));

转换,但是有些简体中文没法转,例如“无”字就没法转换,变成了“?”号。
现在只能这样,找出没法转换的字符(怎么找?),然后unpack成ucs格式(能转成big5的字符不能用ucs,因为程序的要求)。
关键怎么知道哪些字符没法转成繁体呢?



进展,现在有一个效率很低的解决方法,也没法保证会不会出现特殊的情况或问题,请大家帮忙优化一下代码,谢谢啦
$text = encode("ucs-2be",decode("utf8",$text));
$text_big5 .= $_ for map { if (encode("big5",decode("utf8",encode('utf8', decode('utf16-be', pack('n', $_))))) ne "?" || encode('utf8', decode('utf16-be', pack('n', $_))) eq "?") { $_ = encode("big5",decode("utf8",encode('utf8', decode('utf16-be', pack('n', $_))))) } else{ '&#' . $_ . ';' } } unpack 'n*', $text;


[ 本帖最后由 freeand 于 2007-11-2 20:24 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-11-02 18:40 |只看该作者
允许把简体转换成对应的繁体可以吗, 比如 utf-8提交的"无"-->big5 "無"

论坛徽章:
0
3 [报告]
发表于 2007-11-02 18:50 |只看该作者
由于应用的限制,用户提交什么就是什么,保持原格式。如“无”不能转成“無"”,所以只能麻烦地转成ucs。。。

论坛徽章:
0
4 [报告]
发表于 2007-11-02 18:59 |只看该作者
你用的
#utf8 -> big5

$text= encode("big5",decode("utf8",$text));

就可以啊.

转换出来是?的就是没有对应编码的. "?"自身除外.

论坛徽章:
0
5 [报告]
发表于 2007-11-02 19:27 |只看该作者
但这种方法保证吗?
似乎也是一种办法,我刚才也在测试了,但怕会有特殊情况没法得知。。。

论坛徽章:
0
6 [报告]
发表于 2007-11-02 19:31 |只看该作者
虽然效率低了点, 凑合着用吧

论坛徽章:
0
7 [报告]
发表于 2007-11-02 19:53 |只看该作者
又有一个问题,在utf-8页面提交过来的数据放到$text,如何将它分开,一个个检查啊,我用
my @text = split(//,$text);
foreach (@text) {}
发现全部是问号“?”啊
$text是utf-8格式的,不能直接用split分开?那应该怎么分啊?

论坛徽章:
0
8 [报告]
发表于 2007-11-02 20:20 |只看该作者
如果$text是utf8了, 那么@text自然是utf8. 你是通过print发现"?"的吗, print的编码呢.


my $str = decode('gbk', '很好很强大');  # $str:      utf8
my @str_list = split(//, $str);         # @str_list: utf8

for (@str_list) {
    print encode('gbk', $_), "\n";      # Console:   gbk
}


[ 本帖最后由 Lonki 于 2007-11-2 20:22 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2007-11-02 20:28 |只看该作者
原帖由 Lonki 于 2007-11-2 20:20 发表
如果$text是utf8了, 那么@text自然是utf8. 你是通过print发现"?"的吗, print的编码呢.


my $str = decode('gbk', '很好很强大');  # $str:      utf8
my @str_list = split(//, $str);         # @str_lis ...


谢谢!
你这个办法我是想过,但是我怕decode gbk后会影响原始的字符(就像转big5后出现问号的情况,或者用户输入的不是gbk也不是big5的情况下),所以不怕这样用啊。

对了,看顶帖,我更新了一下,附上了目前凑着用的代码,看看要怎样优化或改进。

[ 本帖最后由 freeand 于 2007-11-2 20:34 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2007-11-02 20:36 |只看该作者
decode不用担心, gbk->utf8, big5->utf8一定会有对应的.
倒是print时的encode. big5->utf8->gbk应该没有问题, gbk->utf8->big5可能出现无法对应....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP