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

Mik*_*ike 4 javascript perl encoding utf-8

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

  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 Handler在我们的自定义框架中调用一个函数.在框架打印出文本之前,它会正确显示为"üöä".在被发送到AJAX处理程序之后,它显示为"x {c3}\x {b6}\x {c3}\x {a4}\x {c}}\x {bc}"这是"utf-8表示" UOA".
  7. 在AJAX Handler将其包作为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
Run Code Online (Sandbox Code Playgroud)

回答

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

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

#spreads一些upvote love#

bob*_*nce 6

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

那是:

&Atilde;&para;&Atilde;&curren;&Atilde;&frac14;
Run Code Online (Sandbox Code Playgroud)

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

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

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