php - PHP 在 Unicode 字符串中查找一个单词
问题描述
我正在version
从 Unicode little-endian 文件读取的文本中搜索字符串。
使用 $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'.
这令人困惑。strpos
如果字符串是 ASCII,为什么我在使用原始函数时遇到问题?
更新 2
的十六进制编码'version
是2700 5600 6500 7200 7300 6900 6f00 6e00
。
那是什么编码?
解决方案
即使您正在使用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
。
推荐阅读
- javascript - nested object is not inserted into table using javascript
- kotlin - Kotlin 暴露 SELECT 单条记录
- android - native-debug-symbols 如何与 ndk-stack 一起使用?
- c# - 如何在 Net Core 中解析转义的 JSON 数组
- node.js - Strapi 关系不返回正确的层次结构
- android - 如何在 Android 中的“adb am instrument”期间获取跟踪文件
- mysql - 在 MySQL 中存储 MD5
- firebase - 日期时间从颤振转移到 Firebase Firestore 时会丢失秒数
- python - 如何计算精巧图像中的欧几里得距离
- cuda - 如何将字符串从__global__函数返回到C CUDA中的主函数