2011-01-13 96 views
4

我很高興能夠將基於perl的web框架重建爲UTF8支持。我採取了以下措施Perl UTF8 CGI和DBI ...什麼是正確的工作流程?

主腳本:
use open IO => ":utf8",":std";
use utf8;

的DBI適配器:
$self->{dbh}->{'mysql_enable_utf8'} = 1;'

,並在我的POST請求剖析和GET,基於CGI:
foreach (@val) { $_ = decode("UTF-8",$_); }

這個,據我所知,wo rks在我的本地Ubuntu上使用Perl 5.10.1很好,但是在運行5.10的web服務器上,解碼POST或者GET會弄亂文本。

我必須承認,我對整個UTF8的事情感到非常困惑。我需要
讀模板
從MySQL
過程POST獲取數據和GET 插入到MySQL
寫模板

請問有什麼我忘了嗎?什麼會導致不穩定的行爲?我在主腳本中使用的每個模塊是否需要特別指定use utf8或者如果主腳本執行該操作就足夠了嗎?

感謝您的任何提示,關於你的拉丁語> UTF8的工作我都condolances的
托馬斯

+3

`use utf8;`只是告訴Perl解釋器,你的源代碼是用utf8編碼的。除非在代碼中有utf-8字符串文字,否則根本就不需要該行。 – mfontani 2011-01-13 13:56:17

+1

也可以看看http://www.slideshare.net/Penfold/perl-and-unicode,特別是關於使用`Encode`來編碼/解碼文本,並確保客戶端知道以正確的內容發送數據 - 類型。 – mfontani 2011-01-13 13:56:59

+2

給出一個具體的例子,說明「解碼POST或GET將如何混淆文本」。顯示重現問題所需的完整Perl代碼,構造請求的Web表單以及HTTP請求/響應的轉儲。 – daxim 2011-01-13 14:13:00

回答

0

第一。幾年前我爲一個大型應用程序做了這件事,它的皺紋依然沒有消失。

我建議你做的是把所有東西都變成UTF8,而不是嘗試做解碼和東西。那肯定會搞砸了。將utf8數據存儲在拉丁表中是一種災難。我記得在我的數據庫中有double和tripple編碼的utf8字符串,並且沒有辦法告訴如何找回原始字符串。你應該採取

步驟:

  1. 創建輔助數據庫結構UTF8整理表,而不是拉丁
  2. 提取所有的東西你的主數據庫,並插入到新的數據庫(希望你有沒有存儲任何utf8字符串在那裏)
  3. 確保Mime頭您的應用程序發送瀏覽器指定的編碼是在UTF8,您從這些頁面獲取的所有數據自動採取頁面本身的編碼
  4. 交叉喲你的手指和度假...

你不應該在你的應用程序中有太大的改變,因爲DBI utf8處理在這個時候是相當不錯的。

祝你好運!

羅布

0

看一看this。這是相當一般的,但它會讓你的詞庫直,雖然很多例子是在Python中,每個也是。順便說一句,如果你嘗試拉丁-1(或其他)編碼的東西沒有解碼/重新編碼,災難將隨之而來。

如需更多幫助,請發送具體信息。

乾杯

4

use utf8;是,幾個人說,無操作至於你的I/O問題而言:所有它說的是「把我的源代碼UTF8編碼」。

MySQL/DBI的方法是在金錢上爆炸。

對於CGI,更新到最近的CGI並設置$CGI::PARAM_UTF8=1,它會爲你做decode()。 (作爲一般的提示,BTW,decode_utf8()是相當快!)

至於另一個問題,你可能想比較你的Apache服務器配置,看看AddDefaultCharset設置爲一些無用的值。

此外,請參閱my talk at last year's London Perl Workshop以獲取有關Perl和Unicode的更詳細信息。

1

托馬斯,

隨着額外的負分的危險,我不知道這是否仍然需要,但在過去,我需要確保我的DBI做與UTF8正常表現:

my $ dbh = DBI-> connect(...); $ dbh - > {mysql_enable_utf8} = 1; $ dbh-> do(「set names'utf8';」);

也許它可以幫助

2

這裏的解決方案是排序。

$dbh->{mysql_enable_utf8} = 1; 
$dbh->connect ... 
$dbh->do('SET NAMES \'utf8\';') || die; 

享受:)

-1

你會發現一個完整的(和測試)指導here
它什麼也沒有漏掉; Perl,DBI和MySQL。全部utf8'd。
我有類似的痛苦,但最終都完成了。