[原创] 常见字符编码及Perl的处理

本文介绍常见字符编码方式以及Perl中编码方式转换的实现。

ANSI编码

ANSI的ASCII编码, American Standard Code for Information Interchange, 0-126共127个表示英文字符及常用控制字符,后添加一些符号扩展值255个,1字节。

GB2312/GBK

2字节,每个字节均大于127(0x7F)则表示汉字(以及标点,字母等,即全角),共覆盖6000余种文字。GBK扩展了GB2312,仅需要1个字节大于127即可,覆盖20000余种文字(包括繁体字)。

类似的,台湾定义了BIG5编码覆盖繁体中文,各个国家也定义了自己的多字节字符集MBCS(multi-byte character set)。

UNICODE

ISO规定使用UNICODE(Universal Multiple-Octet Coded Character Set)编码来统一。

UNICODE使用两个字节(16位)表示表示一个字符,共65536中编码方式,覆盖所有语言。

UTF-8/16

Unicode Translation Format – 8,UNICODE转换格式,对于常用字符使用单字节,汉字等使用双字节。8代表每次在网络上传输8位,UTF-16则表示每次传输16位。根据字节顺序,又分为Big Edition与Little Edition。

BOM(Byte Order Mark)

UTF编码中用于标识编码的标准标记,UTF-8 BOM为EF BB BF,UTF16则为FF FE或者FE FF。可用UE打开并以HEX模式查看。

Windows编码识别

Windows打开文件时,若流开始有FF FE或FE FF识别符,则以Unicode处理; 否则,默认以ANSI继续分析。中文系统中,若存在汉子编码,则使用GB2312转换。

Perl中字符编码的处理

Perl中的字符串有两种形式,一种是字节数组(Octets),另一种是UTF-8编码的字符串。Perl内部存在UTF FLAG标记存储方式。

Perl中常用一下方式实现编码转换

根据字符串来源不同,字符串的编码方式不同,常见如下

  • 命令行参数或<STDIN>标准输入:编码跟locale一直。若locale为zh_CN或zh_CN.gb2312,则读入字符串为GB2312编码;若locale是zh_CN.gbk,则字符串为GBK编码; 若编码是zh_CN.UTF8, 则字符串编码为utf8。
  • 文件读入:与文件字符编码方式一致。
  • 源代码里的字符串:与源代码文件一致。若含有中文,最好在文件开头出添加 use utf8; 表示使用该编码方式处理源代码中字符串。
  • 网页抓取:与网页charactset一致

输出时,根据呈现形式转换成特定编码。

  • 标准输出:与locale一致,且utf8 flag关闭。否则会出现乱码或告警Wide character in print at…
  • 文件输出:根据字符编码方式存储。

事实上,PerlIO为我们的输入/输出转码提供了便利, 它针对某个文件句柄, 输入时自动帮你转码并开启utf8 flag, 输出时自动转码并关闭utf8 flag。

 

PS#1

PS#2

Notepad++中可通过Encoding方式实现文件编码的快速转换 (解决打开文件时由于编码识别造成的乱码,如Excel打开csv,可转换为带BOM信息的文件,Excel即可自动调用相关编码)。

 

 

 

留下评论

电子邮件地址不会被公开。 必填项已用*标注