Safari使用不同于Chrome的重音符号对字符串进行编码

时间:2013-12-20 00:26:49

标签: javascript jquery google-chrome utf-8 safari

Chrome中字符串Pépé的长度为6个字符,但Safari中为4个字符。为了确定这一点,我在两个浏览器中打开控制台并输入以下代码:

"Pépé".length

这种差异让我在服务器端遇到麻烦。

我正在使用jQuery。$ ajax发送包含字符串Pépé的数据的POST请求。当该数据到达服务器时,它会以不同方式处理这些值。我在Chrome时可以检索数据,但在Safari中时却无法检索数据。

在ajax请求中,我正在设置参数contentType: application/json; charset=utf-8

在服务器端,从Safari执行POST请求时看起来像P√©p√©,在从Chrome执行POST请求时看起来是PeÃÅpeÃÅ

为什么浏览器之间存在差异?

1 个答案:

答案 0 :(得分:0)

你可能会遇到不同的“规范化”,因为这些重音等可以用不同的方式融入UTF-8。

答案中有一个非常好的讨论:

What is normalized UTF-8 all about?

答案在Stack Overflow的PHP部分中,Java也有类似的操作UTF-8的方法。浏览器可能会发送UTF-8如何发送它。在服务器端,您可能需要将所有数据标准化为NFD或NFC。

我只会强迫一切到NFC服务器端。如果您使用Java,可以这样做:

http://docs.oracle.com/javase/6/docs/api/java/text/Normalizer.html

编辑: 在所有情况下,字节长度和字符长度将取决于规范化,严格的比较也是如此 - 无论编程语言如何。

相关问题