我对以下源代码中的$source_string
和$typed_words
中的字符串感到困惑。它们在浏览器和文本编辑器中显得正常,但“引擎盖下”则是其他内容。以下PHP脚本是一个测试,用于演示我遇到的问题:
<?php
//This string has been copied & pasted from the source
$source_string = "ѕlеер dерrіvаtіоn саn even cause dеаth";
//The same words directly typed, not copied
$typed_words = array("sleep","deprivation","can","even","cause","death");
echo "<p>Original: " . $source_string . "</p>";
echo "<p>Typed: " . implode(" ", $typed_words) . "</p>";
//Let's see if they match
foreach ($typed_words as $word) {
if ( strpos($source_string, $word) !== FALSE )
echo "<p>" . $word . ": FOUND!</p>";
else
echo "<p>" . $word . ": NOT FOUND!</p>";
}
?>
以下是上述代码的输出:
原文:因此甚至可能导致死亡
键入:睡眠剥夺甚至会导致死亡
睡觉:没找到!
剥夺:没找到!可以:找不到!
甚至:找到了!
原因:找到了!
死亡:没找到!
我的猜测是原始字符串中的某些单词包含奇怪的字符编码。所以我使用mb_detect_encoding()
检查了编码,输出如下:
echo mb_detect_encoding($source_string);
输出:
UTF-8
让我们检查一个打字字符串的编码:
echo mb_detect_encoding($typed_words[0]);
输出:
ASCII
在浏览器和文本编辑器中,两个UTF-8和ASCII编码的字符串都很好用。但是尝试使用浏览器的搜索功能并输入“sleep”(没有引号) - 它与$source_string
中的单词不匹配!
我还尝试将UTF-8字符串转换为ASCII,如下所示:
echo mb_convert_encoding($source_string, "ASCII");
这是我得到的输出:
?升??? d ?? r?v?t ?? n ?? n甚至导致d ?? th
这解释了为什么只有“偶数”和“原因”才能找到每个单词搜索字符串时的内容(参见上面的源代码)。它还解释了为什么浏览器搜索功能在搜索时与此字符串中的其他单词不匹配。但那么为什么它在屏幕上“看起来”正常并且在后台“行动”呢?这是怎么回事?