PHP字符串比较古怪

时间:2010-09-08 08:27:36

标签: php string drupal comparison

我正在将数据库中的字符串与数组中的字符串列表进行比较:

if (in_array($entry, array('Söme string', 'other-string')))

这适用于other-string,但不适用于Söme string,主要区别在于此字符串中包含变音符号和html实体。如果数据库中$entrySöme string,则比较失败,即使它应该是相同的字符串。

我还尝试strcmp并使用=====进行直接比较,但比较始终是否定的。在比较之前我也尝试了utf8_encode,但这没有做任何事。

数据库使用的是UTF-8,我使用Drupal API函数获取数据,我的php文件也是UTF-8编码的。如果我将$entrySöme string打印到输出HTML,则它们无法区分。

知道可能导致此行为的原因是什么?

更新

感谢您的帮助。似乎 在途中被转换并存储为数据库中的真正不间断空间,而不是HTML实体。打印它会将其转换回HTML实体(或者当我看到它时,Firebug会这样做。)

var_dump()的输出(使用print函数,取自生成的html源代码):

$entry: string(14) "Söme string"

"Söme string": string(18) "Söme string"

(我编辑了字符串,因为真正的字符串包含一个名字)

更新2

我已将字符串更改为"Some string",这是

的输出
var_dump(bin2hex($entry));
var_dump(bin2hex('Some string'));

$entry: string(24) "536f6d65c2a0737472696e67"
"Some string": string(32) "536f6d65266e6273703b737472696e67"

2 个答案:

答案 0 :(得分:4)

然后字符串不一样。也许:

  • $entry有一个实际的空格,而不是一个不间断的空间。
  • 一个拥有HTML实体 ,而另一个拥有实际的不间断空间。
  • 在其中一个脚本中,角色ö被分解,而另一个则没有。

尝试var_dump数组和$entry

答案 1 :(得分:0)

问题是$entry包含UTF-8编码的非中断空格(0xc2a0)。只是在它上面调用html_entities不起作用,因为我没有指定charset。所以我的解决方案如下:

htmlentities($entry, ENT_QUOTES, 'UTF-8')