Safari 浏览器对带有重音符号的字符串进行编码的方式与 Chrome 不同


字符串

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

"Pépé".length

这种差异在服务器端给我带来了麻烦。

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

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

在服务器端,从 Safari 执行 POST 请求时看起来

P√©p√©,从 Chrome 执行 POST 请求时看起来PeÃÅpeÃÅ

任何线索为什么浏览器之间存在差异?

您可能会

遇到不同的"规范化",因为这些重音等可以通过不同的方式混入 UTF-8。

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

什么是规范化 UTF-8?

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

我会把所有东西都强制到NFC服务器端。 如果你在Java中,这样的东西可以做到:

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

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

最新更新