utf8转gbk出现问号的分析,浅谈perl对二进制的处理

utf8转gbk出现问号的分析,浅谈perl对二进制的处理
2011-07-20 16:42

有时候我们需要将utf8转成gbk,UTF-8用1到6个字节编码UNICODE字符,收录了超过10万个字符,BMP部分也有六万多个字符

而在进行编码转换时,我们往往需要转换为GBK编码进行后续处理,很多网页在转换后,会发现出现大量连续的问号:????????

这些恶心的问号是在编码转换阶段引入的,原因是:

GBK字符集只收录了两万多个字符,比UTF-8的字符数量少得多。

转化到GBK编码的时候,就会有编码落到GBK字符集以外,不能转化成GBK编码。这部分字符在转换之后的字符串中都变成了’?’

UTF-8:采用变长字节 (1 ASCII, 2 希腊字母和排版字符, 3 汉字等多字节东亚语言, 4 平面符号和特殊符号等),

其中双字节字符中有一些没有在GBK字符集中,通常来说UTF-8无法识别的字符都是非常生僻的字符,几乎难以遇到,可不用考虑;但有一个字符非常特殊:C2A0

C2A0是 UTF8里的排版用空格(区别于ASI =20的空格),这个特殊的字符(unicode序号为0xA0),不在GBK字符集中。却频繁用于xml/html等格式的文件中。大量UTF-编码的网页使用这个字符用作占位的空格。而且不同浏览器对它的处理方式不同:IE浏览器识别出该符号并以空格显示,firefox则替换为xml转义字符   当网页中用C2A0进行文字排版时,我们对网页进行编码转换为GBK时就会出现很多"?"问号。

 

处理方法:

      方法一:转换时对文本信息做特殊处理,用0×20代替掉0xC2A0

      方法二:作品XML文件直接以UTF8编码传输。

 

下面谈一下方法一的perl解决方法:

我们知道,在Perl看来, 字符串只有两种形式。 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string。 也就是说: Perl只认识两种编码: Ascii(octets)和utf8(string)。相对应的,方法一也有两种解决方案;(脚本都以utf8保存)

一:以字节流处理
即不打开utf8 flag:
use Encode;

$i='赤足 3.0 12女子跑步鞋 354749-003';     #注意中间的空格是0xc2a0
$i=~s/\xc2\xa0/space/g;
print encode("gbk",decode("utf8",$i));

 

二:以utf8 串处理:

use utf8;
use Encode;

$i='赤足 3.0 12女子跑步鞋 354749-003';

my $space = pack("CC", 0xc2, 0xa0);
Encode::_utf8_on($space);                      
$i =~ s/$space/space/g;
print encode("gbk",$i);

其中4,5行也可以换成:$space = decode("utf8", "\xc2\xa0");

总体原则是,母串和要匹配的要保持一致,要么都打开utf8 flag,要么都不打开。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值