关于perl中中文乱码的解决办法

转载 2016年06月02日 10:00:45

今天在测试lwp模块的时候,发现读取的网站内容含有中文的输出后都是乱码,于是学习了一下perl的Encode模块,写一下总结,做个备忘,也希望能对其他的朋友有帮助!

    先来学习一下perl中编码的基础知识:在Perl看来, 字符串只有两种形式。一种是octets, 即8位序列, 也就是我们通常说的字节数组。另一种utf8编码的字符串, perl管它叫string。 也就是说: Perl只认识两种编码: Ascii(octets)和utf8(string)。

那么perl如何确定一个字符串是octets还是utf8编码的字符串呢? perl可没有什么智能, 他完全是靠字符串上的utf8 flag. 在perl内部, 字符串结构由两部分组成: 数据和utf8 flag.如果utf8 flag是On的话, perl就会把它当成utf8字符串来处理, 如果utf8 flag为Off, perl就会把它当成octets来处理. 所有字符串相关的函数包括正则表达式都会受utf8 flag的影响.

那么确定一个字符串的utf8 flag是否已开启? 使用Encode::is_utf8($str). 这个函数并不是用来检测一个字符串是不是utf8编码, 而是仅仅看看它的utf8 flag是否开启.

一、  字符串读入乱码

读入的内容乱码有两种情形:

1.   字符串本来不是utf8编码的, 应该先把它转成utf8编码, 并且使它的utf8 flag处于开启状态. 比如下面将gbk转换成utf8编码。


点击(此处)折叠或打开

  1. my $out=decode("gbk",$str);

这里拿我们lwp为例子,原来baidu.com的编码为gbk,转换成utf8后就不乱码了。代码如下:


点击(此处)折叠或打开

  1. my $url='http://www.baidu.com';

  2. my $content=get $url;

  3. die "Couldn't get $url" unless defined $content;

  4. my $out=decode("gbk",$content);

  5. print $out,"\n";

2.   字符串编码本来就是utf8, 只是utf8 flag没有打开, 那么你可以使用以下方式中的任一种来开启utf8 flag


点击(此处)折叠或打开

  1. $str = Encode::decode_utf8($str);

  2. $str = Encode::decode("utf8", $str);

二、  字符串输出乱码

字符串在程序内被正确地处理后, 要展现给用户. 这时我们需要把字符串从perl internal form转化成用户能接受的形式. 简单地说, 就是把字符串从utf8编码转换成输出的编码或表现界面的编码. 这时候, 我们使用如下代码来将utf8的编码转换成其他的编码:


点击(此处)折叠或打开

  1. $str = Encode::encode('charset', $str);

参考:http://bbs.chinaunix.net/thread-1713194-1-1.html

perl 写excel,支持中文

perl 写excel,支持中文
  • bing_bing
  • bing_bing
  • 2014年12月25日 12:35
  • 1114

perl 解决mysql utf8中文乱码 问题

mysql utf8 中文问题: zabbix:/root/sbin# cat a1.pl use DBI; my $dbUser='DEVOPS'; my $user="root"; my $pa...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2017年03月10日 20:05
  • 1079

关于perl中中文乱码的解决办法

今天在测试lwp模块的时候,发现读取的网站内容含有中文的输出后都是乱码,于是学习了一下perl的Encode模块,写一下总结,做个备忘,也希望能对其他的朋友有帮助!     先来学习一下perl中编码...
  • kwame211
  • kwame211
  • 2017年07月22日 20:48
  • 99

linux下mysql中文乱码(中文问号)解决办法

今天发现我mysql插入中文时老出现????号了,但保存英文是没有问题的,下面我来给各位同学介绍一下linux下mysql中文乱码解决方法。 linux下则需要修改/etc/my.cnf,在[mys...
  • u014481096
  • u014481096
  • 2016年06月30日 14:36
  • 339

中文乱码的原因及解决方法

1、我们常用的编码表:   ASCLL:美国标准信息交换码      --->用一个字节的7位可以表示 ISO8859-1:拉丁码表、欧洲码表     --->用一个字节的8位来表示 GB2312:中...
  • u011521890
  • u011521890
  • 2015年10月19日 15:33
  • 6053

读取txt的中文字符出现乱码的解决方法

第一种方法:(不知道文件的编码),那通过"另存为"把你不知道的txt编码改为UFT-8,弄一个新的文件。      第二种方法,(知道文件的编码)用inputstreamreader...
  • qq_28950007
  • qq_28950007
  • 2016年02月28日 17:45
  • 920

SciTe 中文设置(解决乱码,中文界面)

SciTe 中文设置(解决乱码,中文界面)   2010-11-20 16:01:13|  分类: 计算机|字号 订阅     作为编程语言尤其是简易脚本语言的轻量...
  • pkorochi
  • pkorochi
  • 2016年05月22日 00:08
  • 845

eclipse 中文乱码问题解决方案汇总

eclipse中文乱码都是因为字符编码与默认的编码不符合导致的,有很多的方法可以解决,不需要安装任何插件就可以搞定。针对不同的情况,需要使用不同的方案,下面就针对一些案例讲解如何解决乱码问题。解决乱码...
  • qilixiang012
  • qilixiang012
  • 2015年12月06日 22:51
  • 2244

Eclipse导入的项目中的中文都是乱码,如何解决?

把项目导入Eclipse时,里边的中文全是乱码,试了很多方法,最终总结一下! eclipse之所以会出现乱码问题是因为eclipse编辑器选择的编码规则是可变的。一般默认都是UTF-8或者GBK,当...
  • c_w_d
  • c_w_d
  • 2016年06月15日 14:07
  • 8740

debian GUN/linux 中文乱码解决办法,secureCRT中文乱码

问题描述:通过secureCRT通过ls命令查看目录下中文文件命及中文内容时乱码 系统:通过# cat /etc/issue查看版本 Debian GNU/Linux 6.0 \n \l 说明:我的所...
  • johnstrive
  • johnstrive
  • 2013年12月09日 21:28
  • 10771
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于perl中中文乱码的解决办法
举报原因:
原因补充:

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