我正在将数据库中的字符串与数组中的字符串列表进行比较:
if (in_array($entry, array('Söme string', 'other-string')))
这适用于other-string
,但不适用于Söme string
,主要区别在于此字符串中包含变音符号和html实体。如果数据库中$entry
为Söme string
,则比较失败,即使它应该是相同的字符串。
我还尝试strcmp
并使用===
和==
进行直接比较,但比较始终是否定的。在比较之前我也尝试了utf8_encode
,但这没有做任何事。
数据库使用的是UTF-8,我使用Drupal API函数获取数据,我的php文件也是UTF-8编码的。如果我将$entry
和Sö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"
答案 0 :(得分:4)
然后字符串不一样。也许:
$entry
有一个实际的空格,而不是一个不间断的空间。
,而另一个拥有实际的不间断空间。ö
被分解,而另一个则没有。尝试var_dump
数组和$entry
。
答案 1 :(得分:0)
问题是$entry
包含UTF-8编码的非中断空格(0xc2a0)。只是在它上面调用html_entities不起作用,因为我没有指定charset。所以我的解决方案如下:
htmlentities($entry, ENT_QUOTES, 'UTF-8')