[心得] 關於 CGI 程式與常見編碼問題

看板Perl作者時間15年前 (2009/11/12 11:28), 編輯推噓3(300)
留言3則, 3人參與, 最新討論串1/1
以下分享個人寫作 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
文章代碼(AID): #1A-u3KZS (Perl)
文章代碼(AID): #1A-u3KZS (Perl)