为啥这个字符编码问题只出现在特定系统上?
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
标签首先需要设置charset
attribute,为什么只在某些系统上?
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-8
。 meta
标签也是<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
是我能想到的所有检查。
生产服务器和浏览器之间可能存在代理,如果没有,则插入编码头。以上是关于为啥这个字符编码问题只出现在特定系统上?的主要内容,如果未能解决你的问题,请参考以下文章