代码之家  ›  专栏  ›  技术社区  ›  Mike

为什么我的mod perl应用程序中的utf8数据仍然会在Web浏览器中出现混乱?

  •  4
  • Mike  · 技术社区  · 15 年前

    在我开始之前,我想强调一下我正在工作的内容的结构。

    1. 有一个文本文件,从中获取特定的文本。文件以UTF-8编码
    2. Perl获取文件并将其打印到页面中。一切都按原样显示。Perl设置为使用UTF-8
    3. Perl生成的网页具有以下标题 <meta content="text/html;charset=utf-8" http-equiv="content-type"/> .因此是UTF-8
    4. 第一次加载之后,所有内容都通过jquery/ajax动态加载。通过翻页,可以加载完全相同的文本,只不过这次是由javascript加载的。请求具有以下标题 Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    5. 处理后端Ajax请求的Perl处理程序以utf-8格式提供内容
    6. Ajax处理程序在我们的自定义框架中调用一个函数。在框架打印出文本之前,它将正确显示为“__”。发送到Ajax处理程序后,它显示“x c3 \x b6 \x c3 \x a4 \x c3 \x bc”,这是“_228;”的UTF-8表示。
    7. 在Ajax处理程序以JSON的形式将其包交付给客户机之后,该网页将打印以下内容:“_¶_·_¼”。
    8. JS和Perl文件本身以UTF-8格式保存(Eclipse中的默认设置)。

    这些就是症状。我尝试了谷歌告诉我的一切,但我仍然有问题。有人知道它可能是什么吗?如果您需要任何特定的代码片段,请告诉我,我将尝试粘贴它。

    编辑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_tf8()。

    我在完全错误的地方开始搜索。感谢所有帮助我在正确的地方搜索的人:)

    #传播一些乐观的爱#

    2 回复  |  直到 15 年前
        1
  •  6
  •   bobince    15 年前

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

    那是:

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

    这表示Ajax处理程序正在使用HTML实体编码函数进行输出,即假定输入来自ISO-8859-1字符集。您可以使用知道UTF-8的字符引用编码器,但是仅仅对可能的特殊字符进行编码可能会更容易一些。 <>&"' 没有其他人。

    请求具有以下头内容类型:application/x-www-form-urlencoded;charset=utf-8

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

        2
  •  2
  •   user181548    15 年前

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

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

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