首先说说各种编码的定义。
1.字符编码、内码、汉字编码
ASCII、GB2312、GBK、GB18030向下兼容,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。
2.Unicode、UCS、UTF
Unicode只与ASCII兼容,与GB码不兼容。Unicode也是一种字符编码方式,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方 案。其中UCS规定怎么用多个字节表示各种文字,UTF则规定怎么传输这些编码。现在一般使用UCS-2,即用两个字节进行编码。而所说的UFT-8就是 以8位为单元对UCS进行编码。
3.cp936是什么?
Unicode统一了编码,但是如何兼容各国的文字编码就需要用到codepage,codepage就是各国的文字编码和Unicode之间的映射表,比如简体中文和Unicode的映射表就是CP936。
从936中随意取一行,例如:
0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH
前面的编码是GBK的编码,后面的是Unicode,通过查这张表,就能简单的实现GBK和Unicode之间的转换。
4.perl
Perl的内部字符串格式:一般是UTF-8,length()得到的是字符个数,注意如果用encode得到UTF-8编码字符串,则length()得到的是字节数。
举例:
$string = "中国"; #cp936,字节流
$internal = decode("cp936",$string);
length($internal) = 2;
$utf8 = encode("utf8",$internal); #将perl内部字符串转化为字节流
length($uft8) = 6;
encode三种模式:
a) use encode:
$octets = encode(ENCODING, $string [, CHECK])
将一个字符串从Perl内部格式转到ENCODING编码。
$string = decode(ENCODING, $octs [, CHECK])
将一个字符串从ENCODING编码转到Perl内部格式。
b) use from_to:
[$length =] from_to($octets, FROM_ENC, TO_ENC [, CHECK])
将$octets从FROM_ENC编码转到TO_ENC编码。
c) use binmode:
binmode(STDOUT, ":utf8")
指示输出到STDOUT时将字符串(Perl内部格式)转换成UTF-8编码。