【问题标题】:'Identical' Strings are different“相同”的字符串不同
【发布时间】:2012-09-06 12:24:33
【问题描述】:

我有 2 个字符串 "CHILDREN’S"。

其中一个被保存到 MySQL 数据库中(实际上它是一个页面标题,来自 WordPress)。另一个是数据库中字符串的复制和粘贴版本。

当我在 2 个字符串 (var_dump("CHILDREN’S"); var_dump($string)) 上运行 var_dump 时,复制粘贴的字符串是 string(12) "CHILDREN’S",而从数据库中显示的字符串是 string(16) "CHILDREN’S"。我假设这是一个 UTF-8 问题。

有人能解释一下为什么相同的字符串实际上是不相同的吗?

【问题讨论】:

  • 是否可以在可见文本周围有空格,或者在字符串中的某处有不可见字符?
  • 那里很可能有一个 unicode 字符。
  • 那个撇号肯定不是'。
  • 浏览器不要复制粘贴,查看HTML代码然后复制粘贴到这里..你会看到隐藏的字符
  • 你有没有检查过它不是一个 HTML 实体——例如 &#xxxx; 在一个版本中? (当您执行var_dump() 时,请尝试页面上的“查看源代码”以确保)这将足以弥补字符串长度的差异。

标签: php string wordpress utf-8


【解决方案1】:

“儿童”是十个字符。要使其变为 12,“'”必须成为 UTF-8 代码点,这没关系。

但除非第二个引号确实是’,否则我看不出有什么办法可以得到 16 个字符。除了 HTML 实体之外,我所知道的没有 7 字节编码。

如果是这样,那么html_entity_decode 可能是你的朋友。

【讨论】:

  • " 不是’,它是一个标准的双引号字符。
  • 你完全正确。我似乎无法数到七个:" 本来是六个字符,替换十分之一得到十六个需要七个字符。事实是,我从来没有真正费心记住那里有无数的引号。如果由我决定,我会坚持使用旧的 ASCII 0x27。
【解决方案2】:

这可能是编码问题,在这种情况下,您需要检查数据库列的编码并确保它是您所期望的。

或者,您的数据库字符串中可能有几个不可打印的字符——可能是您从数据库工具中复制/粘贴了某种讨厌的字符。

【讨论】:

    【解决方案3】:

    我猜它实际上是作为 HTML 实体存储在字符串的一个版本中的。

    如果它存储为’ 而不是实际的’ 字符,那么它显然是不同的字符串长度。

    请记住,PHP 的strlen() 函数不是多字节安全的。如果那里有 unicode 字符,如果您想要准确的字符数,您可能应该使用 mb_strlen() 函数。这可以解释为什么当字符串实际上只包含 10 个字符时,即使是较短的字符数也是 12。

    另一个副本中的额外四个字符可能是由于 HTML 实体造成的。

    【讨论】:

      【解决方案4】:

      要查看字符串的真正不同之处,您可以从每个字符串中写入十六进制。

      例如:

      $s1 = 'CHILDREN\'S';
      
      for($i=0; $i<strlen($s1); $i++)
        echo '0x' . bin2hex(substr($s1, $i, 1)) . ' ';
      

      结果是0x43 0x48 0x49 0x4c 0x44 0x52 0x45 0x4e 0x27 0x53。对数据库中的字符串尝试相同的操作,看看它的不同之处。

      【讨论】:

        猜你喜欢
        • 2015-01-31
        • 2015-05-24
        • 1970-01-01
        • 1970-01-01
        • 2012-12-23
        • 1970-01-01
        • 2012-09-11
        • 2011-04-28
        • 2012-05-01
        相关资源
        最近更新 更多