我被困在比较PHP中的两个Unicode字符串,它们都包含特殊的字符’ö’.一个字符串来自$_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
您可能在较长的字符串中有一个分解的字符,即一个o,然后是一个变音符号组合字符,它覆盖了先前的字符.
规范化函数将修复类似的问题.
附带说明一下,如果要使用等价输入(例如用户名),则应始终规范化输入(即使字符串的二进制表示形式恰好不同,您也要确保两个人不要选择相同的用户名) ).