比较PHP中的两个unicode字符串


Comparing two unicode strings in PHP

我被困在比较两个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