[心得] 關於 CGI 程式與常見編碼問題
以下分享個人寫作 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)
推
11/12 12:39, , 1F
11/12 12:39, 1F
推
11/13 03:42, , 2F
11/13 03:42, 2F
推
11/13 08:48, , 3F
11/13 08:48, 3F
Perl 近期熱門文章
PTT數位生活區 即時熱門文章