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

转载 2012年03月31日 13:57:19
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,要么都不打开。

相关文章推荐

网页UTF8转换GBK后出现问号"?"的原因

网页UTF8转换GBK后出现问号"?"的原因  网页编码转换是进行网页解析和处理的第一步。 互联网上越来越多的网页采用UTF-8编码,UTF-8用1到6个字节编码UNICODE字符,收录了超过10...

gbk转utf8

gbk转utf8

win32中GBK、UTF8的互转

转 http://www.cnblogs.com/hnrainll/archive/2011/05/07/2039700.html win32中GBK、UTF8的互转 #include "...

Windows下Unicode(UCS2),UTF8,GBK(GB2312)互转

Windows下提供了两个编码转换函数:WideCharToMultiByte和MultiByteToWideChar。 用它们可实现Unicode(UCS2),UTF8,GBK(GB2312)互转...

c中实现utf8和gbk的互转

#include #include #include #include #include #include #include int code_convert(char *from_c...

Android之NDK编码转(UTF8->GBK)

基于NDK下的编码转换,当然是直接调用C/C++下的实现效率更高,下面介绍2种方案(不建议通过JNI调用JAVA的实现,尽管这样也能实现编码的转换)。 1. 采用Android系统自带的libicu...

C# 文件从utf8或系统默认格式转gbk写入新文件(支持有bom和无bom)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I...

gbk转为utf8乱码分析

参考一下帖子: http://tieba.baidu.com/f?kz=859774972 http://topic.csdn.net/u/20090822/14/7abb7acf-e7c3-...

GBK转UTF8

问题出现:GBK转UTF-8时,奇数个中文会乱码,偶数个中文不会乱码。 三个中文 public static void encodeError() throws UnsupportedEncod...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)