4

我在一个基于 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 translation( englishvarchar(255) NOT NULL,
languagevarchar(255) NOT NULL, translationvarchar(2000) NOT NULL, ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='将元素文本翻译成外语'

在此处输入图像描述

在 MySQL 的连接函数中,我提供了 'SET character_set_results=NULL'。我尝试使用 utf8,但仅限于某些选项卡的问题已增加到许多部分。

因此,一旦用户登录系统,我们就获取所有翻译并将其存储在 PERL 哈希中并缓存它。我们将此哈希传递给将替换该值的模板文件。

问题: á 和 é 等重音符号被一些不同的字符集符号取代。

例如:在前端,我们看到 Cursos Página Principal 的“Cursos Página Principal”。

它与htmlentities 和 é(e 急性)中给出的解决方案非常相似

谁能告诉我如何在 Perl 中实现相同的目标。

4

1 回答 1

6

表示字符集

例如:在前端,我们看到 Cursos Página Principal 的“Cursos Página Principal”。

当字符被传输为 UTF-8 但被解释为 ISO-8859-1 或类似时,就会发生这种mojibake 。所以我建议解决这个问题的最简单方法是确保您的 HTML 页面以正确的 mime 类型发送到客户端,即

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

如果该信息存在于 HTML 标头中,则该值将覆盖 HTML 文档本身中的任何设置。因此,请确保您设置了 HTML 标头,或者您的 HTML 标头根本不指定字符集,以便浏览器查看元设置。

在某些浏览器(例如 Firefox)中,您可以使用 View / Character Encoding 手动更改字符集。您可以使用它来检查渲染时错误的字符编码是否真的是问题的原因。

实际上编码和解码

在某些情况下,修复字符集无济于事。可能是您根本无法控制框架的那一部分。或者某些东西将您的字符从 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步骤是否必要取决于您与数据库的对话方式。如果您的数据库连接能够支持 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
于 2013-03-06T13:12:40.540 回答