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ÃÅ
。
为什么浏览器之间存在差异?
答案 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
编辑: 在所有情况下,字节长度和字符长度将取决于规范化,严格的比较也是如此 - 无论编程语言如何。