2017-02-16 18 views
1

我在研究導致Perl CGI腳本向數據庫寫入不正確值的錯誤的原因。什麼可能導致perl cgi腳本錯誤地將發佈的表單數據解釋爲UTF-8編碼?

這個Perl腳本從另一個系統(而不是瀏覽器)接收數據,它肯定使用ISO-8859-1編碼。不正確的數據,因爲它被寫入到數據庫中,如下所示:

Gro�Gr�nF�rbung�sterreich 

當它應該是

GroßGrünFärbungÖsterreich 

我發現我可以通過修改腳本來創建這樣一個錯誤的數據庫條目使用decode('utf8', $xyz)而不是$xyz。所以我的問題是:是否有任何影響,例如HTTP標頭,環境變量,配置文件等,這可能會導致perl CGI模塊隱式地執行這個decode

原始源代碼:

my $ack = new CGI; 
my $xyz = $ack->param('xyz'); 
在某些情況下

顯然表現得像:

use Encode qw(decode encode); 
my $ack = new CGI; 
my $xyz = decode('utf8',$ack->param('xyz')); 
+1

你應該很高興沒有[captial sz](https://en.wikipedia.org/wiki/Capital_%E1%BA%9E)''在那裏。 :) – simbabque

回答

2

你應該處理所有數據從Perl程序本身的原始數據字節(字節)外面傳來。如果你明確地使用你假設的編碼,將它用perl(以其原始格式)進行處理,encode用你希望將它放在程序之外的編碼(就像在你的情況下放到數據庫中一樣),你在安全的一面。就像你所看到的,其他一切都可能出錯。

使用句柄(如文件或套接字)時,可以通過使用PerlIO層來完成此操作,因此您不必顯式使用解碼/編碼。

+0

盡我所知,現在我很樂意在事情出錯時找到確切的情況。 –

+1

您是否認爲從Perl到數據庫的部分發生了「腐敗」?你的數據庫編碼是什麼,你用什麼來寫入它等等......如果輸入肯定是iso-8859-1,那麼你的數據庫編碼也是?特別是最後的'-X'部分有時是罪魁禍首,這可能與utf8無關。只是一個想法... – SREagle

+0

...當然,我正在講水和喝葡萄酒 - 我幾乎從不做我的建議,如果我不需要。對我感到羞恥。 – SREagle

相關問題