我正在搜索从Unicode little-endian文件读取的文本中的字符串version
。
有了$ 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'.
这令人困惑。如果字符串是ASCII,为什么我在使用原始strpos
函数时遇到麻烦?
更新2
'version
的十六进制编码为2700 5600 6500 7200 7300 6900 6f00 6e00
。
那是什么编码?
答案 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} }。