首页 > 解决方案 > PHP 在 Unicode 字符串中查找一个单词

问题描述

我正在version从 Unicode little-endian 文件读取的文本中搜索字符串。

使用 $text 'version(打算用撇号)我得到

echo strpos($text, "r");          // Returns 7.
echo strpos($text, "version");    // Returns null.

我怀疑我需要将针或干草堆转换为相同的格式。

有任何想法吗?


在 cmbuckley 的回答之后更新。

$var = iconv('UTF-16LE', 'UTF-8', $fields[0]); 
// Returns Notice: iconv(): Detected an incomplete multibyte character in ...input string in 

所以我检查了现有的编码并找到

echo mb_detect_encoding($fields[0], mb_detect_order(), false);  // Returns 'ASCII'.

这令人困惑。strpos如果字符串是 ASCII,为什么我在使用原始函数时遇到问题?


更新 2

的十六进制编码'version2700 5600 6500 7200 7300 6900 6f00 6e00

那是什么编码?

标签: phpunicode-string

解决方案


即使您正在使用mb_strpos,您也需要确保$needle并且$haystack无论如何都是相同的编码。

我建议您尽快使用 UTF-8,这意味着我将使用iconv将 UTF-16LE 内容转换为 UTF-8 :

$text = file_get_contents('test.txt'); // contains 'version in UTF-16LE

var_dump(strpos($text, 'r'));          // 6
var_dump(strpos($text, 'version'));    // false

$text = iconv('UTF-16LE', 'UTF-8', $text);

var_dump(strpos($text, 'r'));          // 3
var_dump(strpos($text, 'version'));    // 1

请记住进行严格!== false检查(不是 null,正如您在帖子中提到的那样),因为文件内容可能以 string 开头version,在这种情况下 strpos 将返回0


推荐阅读