2012-09-13 117 views
0

我有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问题。

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

+1

你可能会在可见文本周围留下空白,或者在字符串内某处存在不可见的字符? – Fluffeh

+0

很可能你有一个unicode字符。 –

+0

以及撇号字符当然不是'''。 – SDC

回答

0

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

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

1

“CHILDREN'S”是十个字符。要使它成为12,“'”必须成为UTF-8编码点,这没问题。

但我没有办法得到16个字符,除非第二个报价确实是’。除HTML实体外,我没有知道的七字节编码。

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

+1

'"'不是''',它是一个标准的双引号字符。 – SDC

+0

你是完全正确的。我似乎无法计数到七个:'"'将会是六个字符,并且取代十个中的一个以获得十六个所需的七个字符。事实是,我从来没有真正困扰过记住那里的所有无数引号。对于我来说,我会坚持使用旧的ASCII 0x27。 – LSerni

0

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

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

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

其他副本中的其他四个字符可能是由于HTML实体造成的。

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

相关问题