2013-03-06 64 views
4

我在一個基於Web的教育網站上工作,我們正在使用Perl,MySQL 5,Apache和模板工具包。我們計劃在我們的網站上引入對多種語言的支持。如何使用Perl編碼和解碼「急性重音字符」

我們在

都做,如果我們有一個標籤名稱,如課程主頁< \ H1>在我們的模板文件,我們已經轉換,要

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<h1>[% glossary.$language.courses_main_page %]<\h1> 

其中$語言獲得。值當他登錄該用戶選擇

我們有一個表,以保持我們的MySQL數據庫這樣的數據:

CREATE TABLE translationenglish VARCHAR(255)NOT NULL,
language VARCHAR(255)NOT NULL,translation VARCHAR(2000)NOT NULL,)ENGINE = InnoDB的默認字符集= UTF8 COMMENT = 元文本的'翻譯到外語」

enter image description here

在MySQL的連接功能,我提供 'SET character_set_results = NULL'。 我試着用utf8,但限於某些選項卡的問題已增加到很多部分。

因此,只要用戶登錄到系統中,我們將獲取所有翻譯並將其存儲在PERL哈希中並將其緩存。我們將這個散列傳遞給將替換值的模板文件。

問題:像á和é等急性重音字符被替換爲一些不同的字符集符號。

例如:在前端,我們看到CursosPágina校長的「CursosPágina校長」。

它非常類似於htmlentities and é (e acute)

給出的解決方案的任何一個可以告訴我如何實現在Perl一樣。

回答

6

表示的字符集

對於例如:在前端我們看到 「CursosPágina校長」 爲CursosPágina校長。

這個mojibake發生在字符被轉換爲UTF-8但被解釋爲ISO-8859-1或類似的時候。因此,我建議,以解決這個問題最簡單的方法是確保你的HTML頁面被運到客戶端與適當的MIME類型,即

Content-Type: text/html; charset=utf-8 

如果這些信息存在於HTML頭,該值將有覆蓋HTML文檔本身的任何設置。因此,請確保您設置了HTML標頭,或者您的HTML標頭根本不指定字符集,以便瀏覽器查看元設置。

在某些瀏覽器(例如Firefox)中,您可以使用視圖/字符編碼手動更改字符集。您可以使用它來檢查渲染時錯誤的字符編碼是否是問題的原因。

其實編碼和解碼

有些情況下固定的字符集也無濟於事。這可能是因爲你根本不控制你的框架的那部分。或者某些東西將您的字符從ISO-8859-1轉換爲UTF-8 兩次,以便不可讀符號實際上已表示爲UTF-8。在這種情況下,你可以使用Encode模塊在Perl直接編碼字符,使用HTML字符引用作爲輸出:

use Encode qw(decode encode FB_HTMLCREF); 
# maybe: $unicodeString = decode("utf-8", $byteString); 
$htmlString = encode("ascii", $unicodeString, FB_HTMLCREF); 

無論是否decode步驟是neccessary取決於你如何跟你的數據庫。如果你的數據庫連接能夠支持unicode,那麼你已經有了unicode字符串,你可以簡單地將它們編碼爲HTML。對於DBD::mysql,有一個參數mysql_enable_utf8 => 1可以實現這一點。使用它最好是在你自己的代碼中解碼事情。 This answer具有語法的詳細信息。關於這些功能做

一個例子:

$byteString = "Cursos P\xc3\xa1gina Principal."; # two bytes 
$unicodeString = "Cursos P\N{U+00E1}gina Principal."; # one unicode character 
$htmlString = "Cursos P&#225;gina Principal.";  # html character reference 
+0

感謝這個信息。有效。我不需要解碼步驟,因爲Db正在處理該步驟。我看到一些仍然不可讀的地方。 「所有當前條款」應顯示爲「Todos lostérminosactuales」,但顯示爲「Todos los t é rminos actuales」。我正在調試它。 charset = utf-8不適用於我。它重新介紹了這個問題。 – 2013-03-06 14:30:08

+1

從數據庫中讀取數據並將其標記爲utf8可能存在問題(例如,通過':encoding(utf-8)'圖層);我認爲最好是手動編碼。 – 2013-03-12 12:20:25

+0

'é'看起來像雙重實體編碼... – 2013-03-12 12:21:55