为什么我的mod_perl应用程序中的UTF8数据仍然在Web浏览器中出现乱码?

时间:2009-11-09 11:08:59

标签: javascript perl encoding utf-8

在开始之前,我想强调一下我正在使用的结构。

  1. 有一个文本文件,从中可以获取特定文本。该文件以utf-8
  2. 编码
  3. Perl获取文件并将其打印到页面中。一切都按照应有的方式显示。 Perl设置为使用utf-8
  4. Perl生成的网页具有以下标题<meta content="text/html;charset=utf-8" http-equiv="content-type"/>。因此它是utf-8
  5. 第一次加载后,所有内容都通过jQuery / AJAX动态加载。翻阅页面,可以加载完全相同的文本,只有这一次它是由JavaScript加载的。请求具有以下标题Content-Type: application/x-www-form-urlencoded; charset=UTF-8
  6. 在后端处理AJAX请求的Perl处理程序以utf-8
  7. 提供内容
  8. AJAX Handler在我们的自定义框架中调用一个函数。在框架打印出文本之前,它会正确显示为“üöä”。在被发送到AJAX处理程序之后,它显示为“x {c3} \ x {b6} \ x {c3} \ x {a4} \ x {c}} \ x {bc}”这是“utf-8表示” UOA”。
  9. 在AJAX Handler将其包作为JSON发送到客户端之后,网页将打印以下内容:“öäü”。
  10. JS和Perl文件本身保存在utf-8(Eclipse中的默认设置)
  11. 这些是症状。我尝试了谷歌告诉我的一切,但我仍然遇到了问题。有没有人知道它可能是什么?如果您需要任何特定的代码段,请告诉我,我会尝试粘贴它。

    编辑1

    AJAX处理程序的响应标头

    Date: Mon, 09 Nov 2009 11:40:27 GMT
    Server: Apache/2.2.10 (Linux/SUSE)
    Keep-Alive: timeout=15, max=100
    Connection: Keep-Alive
    Transfer-Encoding: chunked
    Content-Type: text/html; charset="utf-8"
    
    200 OK
    

    答案

    在您和this页面的帮助下,我能够找到问题所在。似乎问题不是编码本身,而是Perl将我的变量$ text编码为utf-8两次(根据网站)。解决方案就像添加Encode :: decode_utf8()一样简单。

    我一直在寻找完全错误的地方。我感谢所有帮助我在正确的地方搜索的人:)

    #spreads upvote love#

2 个答案:

答案 0 :(得分:6)

  

返回以下内容:&amp; 38;&amp; 65;&amp; 116;&amp; 105;&amp; 108;&amp; 100;&amp; 101;&amp; 59;&amp; 38;&amp; 112;&amp; 97 ;&安培; 114;&安培; 97;&安培; 59; ...

这是:

&Atilde;&para;&Atilde;&curren;&Atilde;&frac14;

其中说你的AJAX处理程序正在为其输出使用HTML实体编码函数,即假设来自ISO-8859-1字符集的输入。你可以使用一个知道UTF-8的字符引用编码器,但可能只是编码潜在特殊字符<>&"'而不是其他字符。

  

请求具有以下标题Content-Type:application / x-www-form-urlencoded;字符集= UTF-8

MIME类型charset没有application/x-www-form-urlencoded这样的参数。这将被忽略。表单编码字符串本质上是基于字节的;由应用程序来决定它们被视为什么字符集(如果有的话;可能应用程序只需要字节)。

答案 1 :(得分:2)

这不是一个答案,而是一个调试建议。首先想到的是尝试发送像&#1234;这样的HTML实体而不是utf-8代码。要使Perl发送这些,肯定有一个模块或你可以做

 my $text =~ s/(.)/"&#" . ord ($1) . ";"/ge;

在我看来,这个问题最可能的原因是JavaScript接收端并且无法理解Perl编码的UTF-8。