有时候我们需要将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保存) 一:以字节流处理 $i='赤足 3.0 12女子跑步鞋 354749-003'; #注意中间的空格是0xc2a0
二:以utf8 串处理: use utf8; $i='赤足 3.0 12女子跑步鞋 354749-003'; my $space = pack("CC", 0xc2, 0xa0); 其中4,5行也可以换成:$space = decode("utf8", "\xc2\xa0"); 总体原则是,母串和要匹配的要保持一致,要么都打开utf8 flag,要么都不打开。 |
utf8转gbk出现问号的分析,浅谈perl对二进制的处理
最新推荐文章于 2023-07-17 09:31:18 发布
2011-07-20 16:42