【问题标题】:Safari encodes strings with accent marks differently than ChromeSafari 对带有重音符号的字符串进行编码与 Chrome 不同
【发布时间】:2014-01-08 18:22:08
【问题描述】:

Pépé 字符串的长度在 Chrome 中是 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ÃÅ

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

【问题讨论】:

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


    【解决方案1】:

    您可能会遇到不同的“规范化”,因为这些重音等可以通过不同的方式混入 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

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

    【讨论】:

      猜你喜欢
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      相关资源
      最近更新 更多