作者liyih ()
看板Perl
标题[心得] 关於 CGI 程式与常见编码问题
时间Thu Nov 12 11:28:18 2009
以下分享个人写作 CGI 程式时所遇到的编码相关问题与经验,如有错误请多指教。
首先,确认以下两个名词上的差异:
1. Code point (fixed width)
http://en.wikipedia.org/wiki/Code_point
2. Byte strings (variable-width)
http://en.wikipedia.org/wiki/Variable-width_encoding
接着各阶段遭遇到的编码问题与应用方式如下:
###############
# Web Browser #
###############
以 UTF-8 编码为例 (浏览器常见送出 Big5 编码)
1. 网址输入
http://domain/cgi-bin/test.cgi?key=测试123
2. 实际传送
http://domain/cgi-bin/test.cgi?key=%E6%B8%AC%E8%A9%A6123
###############
# Web Server #
###############
1. Method
a. POST => <STDIN> => key=%E6%B8%AC%E8%A9%A6123
b. GET => $ENV{QUERY_STRING} => key=%E6%B8%AC%E8%A9%A6123
###############
# CGI.pm #
###############
1. 读入参数
a. my $key_bs = param('key');
=> \xE6\xB8\xAC\xE8\xA9\xA6123
b. use Encode;
my $key_cp = decode('utf-8', param('key'));
=> \x{6E2C}\x{8A66}123
2. 输出结果
a. print $key_bs;
b. print $key_cp;
(会有警告讯息 Wide character in print at ./test.cgi line ??.)
另外 CGI.pm v3.29 的 param('key') 如果先设定 charset('utf-8')
会传回 Code point,而不是 Byte strings。其他版本似乎较少有这问题。
###############
# test.cgi #
###############
1. 计算长度
a. print length($key_bs); => 9 (bytes)
b. print length($key_cp); => 5 (characters)
2. 正规表示法
a. print join('|', split(//,$key_bs));
b. print join('|', split(//,$key_cp));
参考文件:
1.
http://perlgeek.de/en/article/encodings-and-unicode
2.
http://cpansearch.perl.org/src/LDS/CGI.pm-3.31/Changes
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.114.64.130
※ 编辑: liyih 来自: 140.114.64.130 (11/12 11:36)
1F:推 cutecpu:推 11/12 12:39
2F:推 herculus6502:推 11/13 03:42
3F:推 abliou:推!! 11/13 08:48