PHP在Unicode字符串中找到一个单词

时间:2018-09-11 09:34:08

标签: php unicode-string

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

有了$ text 'version(用撇号表示),我得到了

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

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

  • 我看过mb_strpos,但是它没有以与strpos相同的方式进行文本搜索。
  • 我还考虑过用针线将其更改为UTF-8,但尚未尝试过。似乎有点混乱。

有什么想法吗?


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'.

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


更新2

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

那是什么编码?

1 个答案:

答案 0 :(得分:2)

即使您使用的是idcol,也需要确保mb_strpos$needle的编码相同。

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

$haystack

请记住要进行严格的$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 检查(如您在文章中提到的那样,不为null),因为文件内容可能以字符串!== false开头,在这种情况下strpos将返回{{1} }。