簡體   English   中英

如何使用Perl編碼和解碼“重音符號”

[英]How to Encode and Decode “Acute accented characters” using Perl

我正在一個基於Web的教育網站上工作,我們在這里使用Perl,MySQL 5,Apache和Template Toolkit。 我們計划在我們的網站中引入對多國語言的支持。

我們所做的

如果我們在模板文件中有一個標簽名稱,例如Courses Main Page <\\ h1>,則將其轉換為

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

其中$ language獲取用戶登錄時選擇的值。

我們在Mysql DB中有一個表來維護此數據:

CREATE TABLE translationenglish varchar(255)NOT NULL,
language varchar(255)非空, translation varchar(2000)非空,)ENGINE = InnoDB DEFAULT CHARSET = utf8 COMMENT ='將元素文本翻譯為外語'

在此處輸入圖片說明

在MySQL的connect函數中,我提供了'SET character_set_results = NULL'。 我嘗試使用utf8,但僅限於某些選項卡的問題在很多部分都得到了解決。

因此,一旦用戶登錄到系統,我們將獲取所有翻譯並將其存儲在PERL哈希中並進行緩存。 我們將此哈希傳遞給模板文件,它將替換該值。

問題:諸如á和é等的帶有重音符號的字符已被替換為一些不同的字符集符號。

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

它與htmlentities和é(緊急)中給出的解決方案非常相似

誰能告訴我如何在Perl中實現相同的目標。

表示字符集

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

當字符以UTF-8 格式傳輸但被解釋為ISO-8859-1或類似格式時,就會發生這種mojibake 因此,我建議解決此問題的最簡單方法是確保將HTML頁面以適當的mime類型(即

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

如果該信息出現在HTML標頭中,則該值將覆蓋HTML文檔本身中的任何設置。 因此,請確保您設置了HTML標頭,或者您的HTML標頭根本沒有指定任何字符集,以便瀏覽器可以看到元設置。

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

實際上是編碼和解碼

在某些情況下,修復字符集無濟於事。 可能是您根本無法控制框架的那一部分。 或將您的字符從ISO-8859-1 兩次轉換為UTF-8 兩次 ,這樣實際上不可讀的符號已被表示為UTF-8。 在這些情況下,可以使用HTML字符引用作為輸出,使用Encode模塊直接在Perl中對字符進行編碼:

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

是否需要decode步驟取決於您如何與數據庫對話。 如果您的數據庫連接能夠支持unicode,則您已經有了unicode字符串,您可以簡單地將它們編碼為HTML。 對於DBD :: mysql,有一個參數mysql_enable_utf8 => 1可以達到此目的。 使用它比用自己的代碼解碼事物更好。 這個答案有語法的細節。

這些功能的一個示例:

$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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM