为啥这个字符编码问题只出现在特定系统上?

Posted

技术标签:

【中文标题】为啥这个字符编码问题只出现在特定系统上?【英文标题】:Why does this character encoding issue only occur on select systems?为什么这个字符编码问题只出现在特定系统上? 【发布时间】:2013-10-17 14:48:51 【问题描述】:

我们正在使用一个名为 CKEditor 的 javascript WYSIWYG 文本编辑器。编辑器有一个源视图,用 html 标记用户在文本编辑器中输入的内容。有时编辑器会在这个源视图中插入不间断的空格( ),这很好。

一切似乎都在开发机器上正常运行,因此我们将其部署到生产服务器上。此时,我们开始看到一个奇怪的 Â 字符 (Â) 被插入到文本中。经过一番阅读,我看到 CKEditor 错误跟踪页面上的几张票报告了这一点。我能够通过将 ckeditor.js 的 script 标记上的 charset 属性设置为 UTF-8 来解决此问题。

我的问题是这样的:为什么script 标签首先需要设置charsetattribute,为什么只在某些系统上?

this SO question 的最后一条评论提到,UTF-8 中不间断空格的字节序列实际上是 latin1 中的 Â 字符后跟不间断空格(这是 ISO-8859-1 对的) ?)。这肯定是一个线索,因为每次用户切换到源视图时,都会一个接一个地插入另一个字符。就好像 CKEditor 框架试图注入一个不间断的空间,但它变成了Â&nbsp,然后是ÂÂ&nbsp,等等。所有系统上的content-type(从 Chrome 调试器查看)是text/html;charset=ISO-8859-1,我不确定这是为什么。所有 Tomcat 配置中的 Dfile.encoding 选项都设置为 utf-8meta 标签也是<meta charset="utf-8">

【问题讨论】:

FILE.encoding 应该是file.encoding;系统属性区分大小写! @AaronDigulla 对不起,在服务器上是小写的,我只是打错了。现已修复,谢谢! 【参考方案1】:

在 Web 浏览器中启动您的开发工具。呈现/提交表单时,停下来查看来回发送的请求和响应标头。确保在任何地方都能看到UTF-8。如果它丢失了,那么一侧将假定“默认编码”——不管它可能是什么。

还要确保您拥有set the charset on the forms,因为它们不会自动从页面继承。

编辑 This page 详细解释了在使用 Tomcat 时如何设置字符集以及 servlet 的必要代码。

【讨论】:

所以我检查了页面 GET 请求中的content-type 属性,它是text/html;charset=ISO-8859-1。在那之后,我看不出还有什么重要的事情,因为那时一切都是客户端使用 JavaScript CKEditor 库。也许我错了。 您的 Servlet 代码中可能缺少response.setCharacterEncoding("UTF-8")。有关详细信息,请参阅我的编辑。 很好,在我的 Spring 控制器中这样做将 content-type 更改为 UTF-8 而不是 ISO-8859-1。对我来说真正的谜是为什么这个编码问题不会出现在我们的 Windows 开发机器或我们的 Linux 测试服务器上,而是出现在 Linux 生产服务器上。我认为这肯定是配置差异,但Dfile.encoding 是我能想到的所有检查。 生产服务器和浏览器之间可能存在代理,如果没有,则插入编码头。

以上是关于为啥这个字符编码问题只出现在特定系统上?的主要内容,如果未能解决你的问题,请参考以下文章

字符编码和文件处理

为啥字符串不能像数字一样直接编码

我用vs写的源代码为啥载入xcode时会出现乱码

java 乱码 字符集编码

vim 修改字符编码

为啥python运行json会提示JsonDecodeError?