在网络应用中,我放置<div id="xxx" contentEditable=true >
进行编辑。 encodeURIComponent(xxx.innerHTML)
将通过Ajax POST
类型发送到服务器,其中PHP脚本从中创建一个简单的txt文件,该文件又可以从用户下载以在本地存储或在屏幕上打印。它到目前为止工作得很完美,但是......是的,但是,字符编码是一团糟。像德语Ä
这样的所有特殊字符都被解释为错误。在这种情况下为ä
我谷歌了几天,我研究像iconv()
这样的PHP方法,我知道如何设置浏览器字符编码,并设置文本编辑器以进行正确的对应解码。但没有任何帮助,它仍然是混乱,或甚至变得平常。
所以我的问题是:在从编码/解码往返从浏览器到服务器并返回浏览器的地方,我必须做什么,以确保Ä
仍然是Ä
?
答案 0 :(得分:2)
我回答我的问题,因为结果证明是上面提到的另一个问题。 contenteditable
实际上是html代码部分的一部分。在使用PHP的服务器端,我需要过滤掉contenteditable
文本,我通过DOMDocument这样做:
$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"]);
虽然它有效但却是一招。最后问题遗留下来,如何以正确的方式做到这一点?如果somebedoy有明确的答案,他非常欢迎。
答案 1 :(得分:1)
您需要确保在从用户输入到服务器端存储的整个往返过程中对内容进行一致编码,然后再次返回浏览器。
我建议使用UTF-8。检查您的HTML文档(包括contenteditable
区域)是否为UTF-8编码,并且XMLHttpRequest / Ajax请求在将内容发送到服务器时未指定不同的编码。
检查您的服务器端应用程序是否也将文本文件编码为UTF-8。并在浏览器中请求并下载文件时,检查HTTP响应头是否将文件的编码声明为UTF-8。
沿着此路径的某处,编码不同,这就是导致错误的原因。 iconv
在不同编码之间进行转换,如果一切都一致,则不应该这样做。