perl中文转换小结

每次遇到中文转换都头痛欲裂,经过这次的小程序,终于明白了perl中文字符内码转换原则。

1、perl里面只有两种字符格式Ascii(octets)和utf8(string).  所以你的程序里面只能用这两种。如果你有中文,那么肯定必须使用utf8 了。文件也要保存为utf8 格式,文件头要加上 use utf8.

notepad++里选择 “格式”-“以UTF8格式编码”

2、中文常用有 gbk,gb2312,utf8 。gb2312 和gbk是一样的,只不过gbk支持的字符要多点。你在转换时,必须知道源来的编码是什么,通常,如果你是perl文件,并以utf8 格式保存,那么这个原来的编码就是utf8了。所以,如果要转换成gbk那么程序如下

use Encode;

$str='我是中文';
$newstr= encode('gbk',decode('utf-8',$str));
# $newstr 现在已经是gbk内码了

3、mysql字符集问题,刚才已经说到,perl只支持两种格式,所以你的mysql数据库,表,字段格式也必须是utf8 的,否则麻烦很多。

4、关于perl在windows环境打印中文的问题,因为windows 中文版是gbk格式的,所以如果你是utf8 ,必需转码才能输出内容。

say encode("gbk",decode("utf-8",$str));

5、关于网页采集的问题,国内中文网站有gbk,有utf8的,所以最好先看看编码是什么的,这样就不用猜了。如果你不知道编码,下在用下面的程序猜(来自php-oa.com)

use Encode;
use LWP::Simple qw(get);
use strict;
 
my $str = get "http://www.sina.com.cn";
 
eval {my $str2 = $str; Encode::decode("gbk", $str2, 1)};
print "not gbk: $@\n" if $@;
 
eval {my $str2 = $str; Encode::decode("utf8", $str2, 1)};
print "not utf8: $@\n" if $@;
 
eval {my $str2 = $str; Encode::decode("big5", $str2, 1)};
print "not big5: $@\n" if $@;

获取到你想要的中文后,还是一样的操作,如果网页是utf8 的,可以直接插入mysql(utf8字段),如果你的字段不是utf8 ,那么转换再插入,不过建议还是选择utf8 。

对于操作mysql 前,需要执行set names utf8,程序大约如下

#get the record from  mysql
my $dbi = DBIx::Custom->connect(
  dsn => "dbi:mysql:database=mydb",
  user => 'root',
  password => '',
);

$dbi->do("SET NAMES utf8"); #注意dbix 和 DBI 都可用

 

6、关于url encode的问题,网页请求带有中文url 的时候,必须转换编码,平时可能没有注意到,gbk 和utf8 的编码是不一样的。具体到http://tool.chinaz.com/tools/urlencode.aspx  可以测试。下面的程序来自(PerlChina 552603群友)

use strict;
use warnings;
use utf8;
use 5.010;
use Data::Dumper;
use URI::Escape;
use Encode;

my $str='中文字符';

say uri_escape_utf8($str);
say uri_escape(encode("gbk",$str));

参考

http://www.php-oa.com/2008/12/13/perl-unicode.html