STRPOS в поисках Unicode в PHP (и обращение с Inline UTF-8)
-
30-09-2019 - |
Вопрос
У меня возникли проблемы с простым поиском двух символов строки Unicode (иглу) внутри другой строки (сена HayStack), которые могут или не могут быть UTF-8
Часть проблемы в том, что я не знаю, как указать код для использования в strpos
, и я не знаю, должен ли PHP должен быть скомпилирован с любой специальной поддержкой кода, или если я должен использовать mb_strpos
который я пытаюсь избежать, так как он также может быть не доступен.
т.е. Например, иглу U+56DE U+590D
(без пространства)
С preg_match это может быть preg_match("@\x{56DE}\x{590D}@",$haystack)
Но это на самом деле требует @u
что может быть недоступно, и я получаю Compilation failed: character value in \x{...} sequence is too large
в любом случае.
Я не хочу использовать reg_match в любом случае, так как он может быть значительно медленнее, чем Strpos (есть ищеты другие последовательности, которые необходимо искать).
Могу ли я конвертировать U+56DE U+590D
в его одну байтовую последовательность (возможно 5-6 символов), а затем ищите его через Strpos? Я не могу понять, как преобразовать его в байты, если это так.
Как вы указываете Unicode Inline в PHP в любом случае? Я имею в виду вне PRCE?
$blah="\u56DE\u590D";
не работает?
Спасибо за любые идеи!
Решение
Во-первых, ваш вопрос плохо структурирован. У него есть несколько вопросов в нескольких точках. Вы, вероятно, получите больше ответов, если вы использовали более четкую структуру: 1) Опишите эту задачу, которую вы пытаетесь выполнить, 2) ограничения / требования, 3) Стратегия, которую вы рассмотрели, 4) трудности, которые вы нашли с такой стратегией / Есть ли лучший.
Это сказано, я начну к концу:
$blah="\u56DE\u590D";
не работает?
Нет. Язык ничего не знает о Unicode. В PHP строки являются байтовыми массивами. Следовательно, как вы выражаете точки кода Unicode в скрипте PHP, зависит от кодировки, которую вы хотите использовать. Для UTF-8 это было бы "\xE5\x9B\x9E\xE5\xA4\x8D"
, для UTF-16 большой Endian будет "\x56\xDE\x59\x0D"
, и так далее.
Могу ли я конвертировать
U+56DE U+590D
в его последовательность одной байты (возможно, 5-6 символов), а затем ищите его черезstrpos
? Я не могу понять, как преобразовать его в байты, если это так.
Для первой части, да, то есть, преобразование U+56DE U+590D
в байты, разъяснение необходимо. Эти кодовые единицы UTF-16 или кодовые точки Unicode? Например, как 𪛖
представлен? U+D869 U+uDED6
или U+2A6D6
? Если они являются единицами кодов Unicode, это тривиально кодировать их в UTF-16. Для Big Endian UTF-16, это просто "\x56\xDE\x59\x0D"
. Отказ В противном случае он все еще тривиален для кодирования их UTF-32, но требуется немного больше работы, чтобы сделать то же самое в UTF-16 (или UTF-8).
Для второй части продолжай прочитать.
Часть проблемы в том, что я не знаю, как указать код для использования в
strpos
, и я не знаю, должен ли PHP должен быть скомпилирован с любой специальной поддержкой кода, или если я должен использоватьmb_strpos
который я пытаюсь избежать, так как он также может быть не доступен.
Что ты пытаешься сделать? Почему вам нужно найти позицию в строке? strpos
даст вам смещение байта для данной строки (опять же, интерпретируемая в двоичной форме). Вы пытаетесь порезать строку? strpos
(или даже mb_strpos
) Средняя проблема в Unicode - глиф может быть состоится несколькими кодами, поэтому вы рискуете отсечить часть глифа. Я не могу посоветовать вам больше, если вы не скажете, что вы пытаетесь сделать.
Другие советы
Вы писали «могут быть недоступны». Я предлагаю вам попробовать mb_strpos..