PHP найти слово в строке Unicode - PullRequest
0 голосов
/ 11 сентября 2018

Я ищу строку version в тексте, считанном из файла с прямым порядком байтов Unicode.

С $ 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.

Какая это кодировка?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Я создал файл с шестнадцатеричным содержимым, которое вы предоставили, и сумел найти решение:

<?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):

enter image description here

Используемая версия PHP: PHP 5.6.36

0 голосов
/ 11 сентября 2018

Даже если вы используете 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.

...