我被困在比较两个unicode字符串在PHP都包含特殊字符'ö'。一个字符串来自$_GET
,另一个字符串是文件系统的文件夹名(scandir()
)。两个字符串似乎都等于我,使得
var_dump($filter);
var_dump($tail . '/' . $k);
它们上的也显示它们相等,但的字符串长度不同 (?!):
string '/blöb' (length=7)
string '/blöb' (length=6)
比较它们的代码片段如下:
if($filter == ($tail . '/' . $k)) {
/* ... */
}
这是怎么回事?
附加信息: $tail
为空字符串:
string '' (length=0)
查看此处:http://en.wikipedia.org/wiki/Unicode_equivalence并使用此:http://www.php.net/manual/en/class.normalizer.php
您可能在较长的字符串中有一个分解字符,意思是一个0,然后是一个覆盖前一个字符的变音符组合字符。
normalizer函数将修复类似的问题。
作为旁注,如果您将其用于等效(例如用户名-您希望确保两个人不会选择相同的用户名,即使字符串的二进制表示恰好不同),则应始终规范化您的输入。
您可以尝试通过utf8_encode()解析它们并检查它们吗?PHP不支持unicode,因此建议对一些基本的unicode特性使用utf8_encode/decode。
http://php.net/manual/en/language.types.string.php