为了我那个自动分行的程序,今天仔细研究了一下字符编码,大概搞明白了 perl 对于字符编码的处理。
perl 内部是用`宽字符(一个整数,在 32位系统上MAX=2^32, 64位系统上MAX=2^64)'来表示字符的,对于(从文件、标准输入或程序源码)读入的字符,perl 把它当作字节流存储,并不进行解码。
当需要(譬如要split一个字符串)的时候按照内部`宽字符'解码,如果读入的字符是其它(UTF8、cp936、gb2312、Big5 等等)编码方式时,就需要用Encode::decode 告诉 perl 用正确的方式将字符流解码为 perl内部的`宽字符'。
输出的时候需要将字符流编码。 譬如 windows 中文系统默认为 cp936 编码,这时就需要 Encode::encode("cp936", $str); 告诉 perl 将`宽字符'以 cp936 标准编码,否则在标准输出上将显示乱码。
如果想转换字符编码方式,只需要以正确的方式先将读入的字符 decode,再以需要的编码方式 encode 就行了。
没有评论:
发表评论