“相同的”字符串是不同的

时间:2012-09-13 12:05:32

标签: php string wordpress utf-8

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

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

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

有人可以说明为什么相同的字符串实际上并不相同。

4 个答案:

答案 0 :(得分:1)

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

但我认为除非第二个引语真的是’,否则无法获得16个字符。除HTML实体外,我不知道有七个字节的编码。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

另一个副本中的其他四个字符可能是由HTML实体引起的。

答案 3 :(得分:0)

要查看字符串的真正差异,可以在每个字符串中写出十六进制。

例如:

$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。尝试使用数据库中的字符串,并查看它的不同之处。