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,要么都不打开。

perl encode_utf8 和decode_utf8

encode_utf8 $octets = encode_utf8($string); 相当于 $octets = encode("utf8", $string). 这个...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2017年03月12日 13:15
  • 486

UTF-8转GBK的悲剧:特殊字符C2A0

这个问题出现得比较早:在传给印象派的作品描述XML(GBK编码)中一些文字信息经常包含乱码,而且会一乱到底,甚至导致不同页的错乱。刚开始一直都没有什么头绪,不过后来终于发现了部分头绪:GBK的字符集过...
  • ccm1125
  • ccm1125
  • 2014年03月11日 15:16
  • 4850

[经验总结]解决Perl读取utf-8编码文件的问题

  一段Perl代码,放到Windows平台上就输出乱码,刚在网络上找到下面两行代码,解决了乱码问题: use encoding 'gbk';use open IN=>':encoding(utf8)...
  • ThinkHY
  • ThinkHY
  • 2010年08月29日 20:24
  • 1119

Perl读取Excel文件并解决中文乱码问题

使用CPAN中的Spreadsheet::ParseExcel模块读取Excel文件中的内容,当遇到中文乱码问题时,使用Spreadsheet::ParseExcel::FmtUnicode模块对中文...
  • orochris
  • orochris
  • 2016年12月08日 10:57
  • 961

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

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

perl遍历文件夹将文件转化为utf-8格式

制作需求来源: 用eclipse打开网站源码,发现java代码中文乱码,想都不用想,文件格式肯定不是utf-8(因为以前我用notepad++看过),这次我实在是不想手动改了,就用perl处理了,搜了...
  • ChangHongJian
  • ChangHongJian
  • 2014年12月07日 22:13
  • 850

perl unload gbk oracle 数据库

perl unload gbk Oracle 数据库 use Encode; if ( $#ARGV < 0 ){ print "请输入一个文件\n"; exit(-...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2016年11月17日 17:57
  • 227

perl 中文处理 乱码

今天在处理数据时,发现perl的中文输出总是乱码,后来用 use Encoding; encode("gbk", decode("utf-8", $str)); 这样的语句转一下就好了,...
  • Iamduoluo
  • Iamduoluo
  • 2014年03月18日 09:26
  • 1705

[转]UTF-8到GBK转码的特殊字符问题

 朋友开发的时候遇到一个问题,在过服务代理的时候,代理把UTF-8的中文编码强制给做成GBK的了,于是就开始了漫长的UTF-8到GBK的编码。感觉上很简单,但是就是发现在中文正常的文本后多了个 'x0...
  • cnhome
  • cnhome
  • 2010年12月16日 13:57
  • 2559

Perl中文/unicode/utf8/GB2312之间的转换

本文转载自:
  • chivalrousli
  • chivalrousli
  • 2014年10月23日 17:04
  • 2206
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:utf8转gbk出现问号的分析,浅谈perl对二进制的处理
举报原因:
原因补充:

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