加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl 中文处理

发布时间:2020-12-15 23:43:25 所属栏目:大数据 来源:网络整理
导读:昨天弄了一个小程序,从文件中读出数据,进行一些赋值和操作,其中文件中有中文。最后读入程序发现是乱码。类似编码问题是最麻烦的,很多人都会 搞的莫名其妙。不过最后还是解决了。先说一下我运行环境: OS:? Windows 7 sp1 x64 Perl version : Strov5.20.1

昨天弄了一个小程序,从文件中读出数据,进行一些赋值和操作,其中文件中有中文。最后读入程序发现是乱码。类似编码问题是最麻烦的,很多人都会

搞的莫名其妙。不过最后还是解决了。先说一下我运行环境:

OS:? Windows 7 sp1 x64

Perl version : Strov5.20.1 built for MSWin32-x64-multi-thread


数据存储在txt文件中,编码为UTF-8 with no BOM ,即没有文件开头的BOM (Byte Order Mask) 标志。

读入数据代码:

my @data = undef;
open FILE,$data_file
	or die "i cannot open data file";
@data = <FILE>;

当从文件$data_file 中读入数据时,句柄为FILE, 以后以行为一个元素存储在@data 数组中。

但当我使用 print @data 时,发现其中的ascii字符还好,但中文字符就出现异常。全是乱码。


最后尝试使用了decode () 和 encode () 进行解码编码,解决问题。

在perl 眼里,字符串只有两种,一种是octet,即八位组串,类似C的ASCII 字符串,char*。每一个字符被看做是一个字节,所以使用ASCII编码。还有一种是Unicode编码,使用Unicode来解析这一串char数组。而控制其解码方式的,是在数据中头几位标识的UTF flag是否被设置。若被设置,则按Unicode看待,否则按octet。

简而言之,一个数组int8_t* ,要么使用char*的方式解析, 要么使用wchar_t* 的方式解析。

而文件中的数据是UTF-8编码的,只能使用Unicode方式解析。但读入数据到@data 时,每一个字符串中的utf flag 没有被设置(默认),因此要显式设置。但此时并不能用print 显示出来,还需要使用encode () 将编码后的数据转化成字节流,这样才能正确输入。


引入包:

use Encode;
use utf8;

解码与编码:

my $res = Encode::decode ("utf8",$str); # 告知perl 是什么编码类型
$res = Encode::encode ("gb2312",$res);   # 将编码后的数据转化成字节流
当然,告知perl是utf-8 也可以使用Encode :: _utf8_on () 函数开启UTF 标志,但因为不是作者导出的函数,建议不从外部调用。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读