Javascript 为什么这个字符编码问题只发生在选定的系统上?
我们正在使用一个名为CKEditor的JavaScript所见即所得文本编辑器。编辑器有一个源代码视图,用HTML标记用户在文本编辑器中输入的内容。有时编辑器会将不间断的空格(Javascript 为什么这个字符编码问题只发生在选定的系统上?,javascript,spring,tomcat,character-encoding,ckeditor,Javascript,Spring,Tomcat,Character Encoding,Ckeditor,我们正在使用一个名为CKEditor的JavaScript所见即所得文本编辑器。编辑器有一个源代码视图,用HTML标记用户在文本编辑器中输入的内容。有时编辑器会将不间断的空格()插入到这个源代码视图中,这很好 在开发人员的机器上,一切似乎都正常工作,因此我们将其部署到生产服务器上。此时,我们开始看到文本中插入了一个奇怪的字符(Â;)。经过一番阅读,我看到在CKEditor bug跟踪页面上的一些记录中报告了这一点。通过将ckeditor.js的script标记上的charset属性设置
)插入到这个源代码视图中,这很好
在开发人员的机器上,一切似乎都正常工作,因此我们将其部署到生产服务器上。此时,我们开始看到文本中插入了一个奇怪的字符(Â;
)。经过一番阅读,我看到在CKEditor bug跟踪页面上的一些记录中报告了这一点。通过将ckeditor.js的script
标记上的charset
属性设置为UTF-8
,我能够解决这个问题
我的问题是:为什么脚本
标记首先需要字符集
属性集,为什么只在某些系统上
最后一条评论提到,UTF-8中非中断空格的字节序列实际上是
latin1
中后跟非中断空格的字符(ISO-8859-1,对吗?)。这肯定是一个线索,因为每次用户切换到源代码视图时,都会一个接一个地插入另一个字符。这就好像CKEditor框架试图注入一个不间断的空间,但这会变成然后等等。所有系统(从Chrome调试器查看)上的内容类型为text/html;charset=ISO-8859-1
,我不确定原因。所有Tomcat配置中的Dfile.encoding选项都设置为utf-8
。meta
标记也是
在Web浏览器中启动您的开发工具。呈现/提交表单时,停止并查看来回发送的请求和响应头。确保到处都能看到UTF-8
。如果它丢失了,那么其中一方将采用“默认编码”——不管是什么
还要确保您有,因为它们不会自动从页面继承
EDIT详细说明了在使用Tomcat以及servlet所需代码时如何设置字符集。在Web浏览器中启动开发工具。呈现/提交表单时,停止并查看来回发送的请求和响应头。确保到处都能看到UTF-8
。如果它丢失了,那么其中一方将采用“默认编码”——不管是什么
还要确保您有,因为它们不会自动从页面继承
EDIT详细说明了在使用Tomcat和servlet所需的代码时如何设置字符集。FILE.encoding
应该是FILE.encoding
;系统属性区分大小写@抱歉,这是服务器上的小写字母,我只是打错了。现在修好了,谢谢FILE.encoding
应该是FILE.encoding
;系统属性区分大小写@抱歉,这是服务器上的小写字母,我只是打错了。现在修好了,谢谢!因此,我检查了页面GET请求上的content-type
属性,它是text/html;字符集=ISO-8859-1
。在这之后,我看不出还有什么会起作用,因为在JavaScript编辑器库中,一切都是客户端的。可能我错了。您的Servlet代码中可能缺少响应。setCharacterEncoding(“UTF-8”)
。有关详细信息,请参见我的编辑。很好,在我的Spring控制器中这样做将内容类型更改为UTF-8
,而不是ISO-8859-1
。然而,对我来说真正的谜团是,为什么这个编码问题不会出现在我们的Windows开发机器或Linux测试服务器上,而会出现在Linux生产服务器上。我想这肯定是配置上的差异,但是Dfile。编码是我唯一能想到的检查方法。在生产服务器和浏览器之间可能有一个代理,如果没有,它会插入一个编码头。因此,我检查了页面GET请求上的内容类型属性,它是text/html;字符集=ISO-8859-1
。在这之后,我看不出还有什么会起作用,因为在JavaScript编辑器库中,一切都是客户端的。可能我错了。您的Servlet代码中可能缺少响应。setCharacterEncoding(“UTF-8”)
。有关详细信息,请参见我的编辑。很好,在我的Spring控制器中这样做将内容类型更改为UTF-8
,而不是ISO-8859-1
。然而,对我来说真正的谜团是,为什么这个编码问题不会出现在我们的Windows开发机器或Linux测试服务器上,而会出现在Linux生产服务器上。我想这肯定是配置上的差异,但我想检查的只是编码。在生产服务器和浏览器之间可能有一个代理,如果没有,它会插入编码头。