Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html “如何编码和解码”;尖锐重音字符“;使用Perl_Html_Mysql_Perl_Template Toolkit - Fatal编程技术网

Html “如何编码和解码”;尖锐重音字符“;使用Perl

Html “如何编码和解码”;尖锐重音字符“;使用Perl,html,mysql,perl,template-toolkit,Html,Mysql,Perl,Template Toolkit,我在一个基于web的教育网站工作,在那里我们使用Perl、MySQL 5、Apache和模板工具包。我们计划在我们的网站中引入对多语言的支持 我们在这方面做了些什么 如果我们的模板文件中有一个选项卡名,如Courses主页,我们将其转换为 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <h1>[% glossary.$language.courses_main_page %]<

我在一个基于web的教育网站工作,在那里我们使用Perl、MySQL 5、Apache和模板工具包。我们计划在我们的网站中引入对多语言的支持

我们在这方面做了些什么

如果我们的模板文件中有一个选项卡名,如Courses主页,我们将其转换为

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

[%glossary.$language.courses\u主页%]
其中,$language获取用户登录时选择的值

我们在Mysql数据库中有一个表来维护这些数据:

创建表
translation
english
varchar(255)不为空,
language
varchar(255)不为空,
translation
varchar(2000)不为空 NULL,)引擎=InnoDB默认字符集=utf8注释==翻译 将元素文本转换为外语的

在MySQL的connect函数中,我提供了“SET character\u SET\u results=NULL”。 我试过使用utf8,但是这个问题只限于一些选项卡,它增加到了许多部分

因此,只要用户登录到系统中,我们就获取所有翻译并将其存储在PERL哈希中并缓存。我们将这个散列传递给模板文件,模板文件将替换该值

问题:像á和é等尖锐重音字符正在被一些不同的字符集符号所取代

例如:在前端,我们看到“Cursos página Principal”代表Cursos página Principal

这与中给出的解决方案非常相似

谁能告诉我如何在Perl中实现同样的功能。

表示字符集 例如:在前端,我们看到“Cursos página Principal”代表Cursos página Principal

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

内容类型:text/html;字符集=utf-8
如果该信息存在于HTML标题中,则其中的值将覆盖HTML文档本身中的任何设置。因此,请确保您设置了HTML头,或者您的HTML头没有指定任何字符集,以便浏览器可以查看元设置

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

实际编解码 在某些情况下,修复字符集不会有帮助。可能是您根本无法控制框架的这一部分。或者某个东西将您的字符从ISO-8859-1转换为UTF-8两次,这样不可读的符号实际上已经表示为UTF-8了。在这些情况下,您可以使用模块直接在Perl中编码字符,使用HTML字符引用作为输出:

use Encode qw(decode encode FB_HTMLCREF);
# maybe: $unicodeString = decode("utf-8", $byteString);
$htmlString = encode("ascii", $unicodeString, FB_HTMLCREF);
是否需要执行
解码
步骤取决于您与数据库的对话方式。如果您的数据库连接能够支持unicode,那么您已经有了unicode字符串,您可以简单地将这些字符串编码为HTML。因为有一个参数
mysql\u enable\u 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

谢谢你的信息。成功了。我不需要解码步骤,因为Db正在处理。我看到一些地方仍然看不懂。“所有当前术语”应显示为“Todos los términos actuales”,但显示为“Todos los té;rminos actuales”。我现在正在调试它。charset=utf-8不适合我。它重新引入了该问题。从数据库读取数据并将其标记为utf8(例如,通过
:encoding(utf-8)
层)可能会出现问题;我认为手工运行编码更好。@JakubNarębski:我同意。这看起来像是沿途有人在重新编码。这在输入可能包含必须为HTML编码的字符的情况下是有意义的。如果这只影响某些文本,则表示文本沿着不同的路径传递。消除这些差异可能有助于找到适合所有情况的解决方案:始终传递HTML字节,或始终传递unicode字符串,或始终传递UTF-8字节。@user1254174:请注意上面的注释。在我之前的评论中太糟糕了。