Я ищу строку version
в тексте читать из файла с прямым порядком байтов Unicode.
С текстом $ '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
,
Что это за кодировка?
Даже если вы используете mb_strpos
, вам нужно убедиться, $needle
а также $haystack
в любом случае одинаковая кодировка
Я бы посоветовал вам использовать UTF-8 как можно чаще и как можно скорее, а это значит, что я бы конвертировал контент UTF-16LE в UTF-8, используя Iconv:
$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
отметьте (не ноль, как вы упоминаете в своем посте), поскольку содержимое файла может начинаться со строки version
в этом случае strpos вернет 0
,
Я создал файл с шестнадцатеричным содержимым, которое вы предоставили, и сумел найти решение:
<?php
$text = file_get_contents(__DIR__.'/test');
$text = mb_convert_encoding($text, 'UTF-8', 'UTF-16LE');
var_dump(strpos($text, "r")); // int(3)
var_dump(strpos($text, "Version")); // int(1)
Содержание test
(рассматривается в Hex Fiend):
Используемая версия PHP: PHP 5.6.36