比较PHP中的两个unicode字符串

我被困在比较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,然后是一个变音符号组合字符,它覆盖了先前的字符.

规范化函数将修复类似的问题.

附带说明一下,如果要使用等价输入(例如用户名),则应始终规范化输入(即使字符串的二进制表示形式恰好不同,您也要确保两个人不要选择相同的用户名) ).

上一篇:java-如何轻松地将修改后的代码与参考实现进行比较?


下一篇:在bash(Linux)中从另一个csv(如vlookup)中查找值