【问题标题】:Character Encoding/decoding becomes a mess字符编码/解码变得一团糟
【发布时间】:2015-07-18 10:38:10
【问题描述】:

在 web 应用程序中,我放置 <div id="xxx" contentEditable=true > 用于编辑目的。 encodeURIComponent(xxx.innerHTML) 将通过 Ajax POST 类型发送到服务器,PHP 脚本从中创建一个简单的 txt 文件,然后可以从用户那里下载该文件以将其存储在本地或在屏幕上打印。到目前为止它工作得很好,但是……是的,但是,字符编码是一团糟。所有像德语 Ä 这样的特殊字符都被解释为错误的。在这种情况下为ä 我在谷歌上搜索了几天,研究了iconv() 之类的 PHP 方法,我知道如何设置浏览器字符编码并设置文本编辑器以进行正确的对应解码。但没有任何帮助,它仍然是一团糟,甚至变得奇怪。

所以我的问题是:在从浏览器到服务器再回到浏览器的编码/解码往返过程中,我必须做什么,以确保Ä 仍然是Ä

【问题讨论】:

    标签: php ajax character-encoding


    【解决方案1】:

    我回答我的问题,因为它原来是如上所述的另一个问题。 contenteditable 实际上是一段 html 代码的一部分。在使用 PHP 的服务器端,我需要过滤掉我通过 DOMDocument 执行的 contenteditable 文本,如下所示:

    $doc = new DOMDocument();
    $doc->loadHTML($_POST["data"]);
    

    然后我照常访问元素及其文本内容。 最后我用

    保存文本
    file_put_contents($txtFile,  $plainText, LOCK_EX);
    

    然后保存的文本就像上面写的那样一团糟。现在事实证明,您需要告诉 DOMDocument 必须解释 loadHTML() 的字符集。在这种情况下,UTF-8。 首先,我按照 PHP 中的建议这样做了:

    $doc = new DOMDocument('1.0', 'UTF-8');
    

    但这无济于事(我想知道)。然后我在 SO 中找到了this 答案。最终的解决方案是这样的:

    $doc->loadHTML('<?xml encoding="UTF-8">' . $_POST["data"]);
    

    虽然它有效,但它是一个技巧。最后剩下的问题是,如何以正确的方式做到这一点?如果有人有明确的答案,他是非常欢迎的。

    【讨论】:

      【解决方案2】:

      您需要确保内容在从用户输入到服务器端存储并再次返回浏览器的整个往返过程中进行一致编码。

      我建议使用 UTF-8。检查您的 HTML 文档(包括 contenteditable 区域)是 UTF-8 编码的,并且 XMLHttpRequest/Ajax 请求在将内容发送到服务器时没有指定不同的编码。

      检查您的服务器端应用程序是否也将文本文件编码为 UTF-8。并检查在浏览器中请求和下载文件时,HTTP 响应标头是否将文件的编码声明为 UTF-8。

      在这条路径上的某个地方,编码不同,这就是导致错误的原因。 iconv 在不同的编码之间进行转换,如果一切都一致,则不需要这样做。

      祝你好运!

      【讨论】:

      • 感谢您的提示。继承conteneditable 的HTML 文档被声明为&lt;meta charset="utf-8"&gt;。这可以被覆盖吗? XMLHttpRequest/Ajax 请求没有特定的编码,除了“encodeURIComponent”。所以 UTF-8 应该通过。服务器端我没有特殊的编码/解码设置。怎么做 ?在哪里声明用于下载的 HTTP 响应标头?
      • 响应中的Content-Type HTTP 标头将覆盖 HTML 文档本身中声明的任何字符编码,例如使用&lt;meta charset&gt; 标签。在控制台中检查Content-Type 标头值“text/html; charset=utf-8” 用于网页和“text/plain; charset=utf-8” 用于文件下载。如果这些错误,请在您的服务器端应用程序中使用 PHP 的 header() 函数更正它们:php.net/header :)
      猜你喜欢
      • 2011-02-02
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多