Вопрос

У меня возникли проблемы с простым поиском двух символов строки 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..

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top