昨天弄了一个小程序,从文件中读出数据,进行一些赋值和操作,其中文件中有中文。最后读入程序发现是乱码。类似编码问题是最麻烦的,很多人都会
搞的莫名其妙。不过最后还是解决了。先说一下我运行环境:
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 没有被设置(默认),因此要