如何在utf8字符里判断gbk或big5编码

如何在utf8字符里判断gbk或big5编码



[Copy to clipboard] [ - ]
CODE:
汉字無法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;


允许把简体转换成对应的繁体可以吗, 比如 utf-8提交的"无"-->big5 "無"
由于应用的限制,用户提交什么就是什么,保持原格式。如“无”不能转成“無"”,所以只能麻烦地转成ucs。。。
你用的
#utf8 -> big5

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

就可以啊.

转换出来是?的就是没有对应编码的. "?"自身除外.
但这种方法保证吗?
似乎也是一种办法,我刚才也在测试了,但怕会有特殊情况没法得知。。。
虽然效率低了点, 凑合着用吧
又有一个问题,在utf-8页面提交过来的数据放到$text,如何将它分开,一个个检查啊,我用
my @text = split(//,$text);
foreach (@text) {}
发现全部是问号“?”啊
$text是utf-8格式的,不能直接用split分开?那应该怎么分啊?
如果$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
}




QUOTE:
原帖由 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的情况下),所以不怕这样用啊。

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

decode不用担心, gbk->utf8, big5->utf8一定会有对应的.
倒是print时的encode. big5->utf8->gbk应该没有问题, gbk->utf8->big5可能出现无法对应....