strpos ищет юникод в PHP (и обрабатывает встроенный UTF-8)

У меня возникла проблема, связанная с простым поиском двухсимвольной строки Unicode (игла) внутри другой строки (стог сена), которая может быть или не быть 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 тем не мение.

В любом случае я не хочу использовать preg_match, поскольку он может быть значительно медленнее, чем strpos (есть другие последовательности, которые нужно искать).

Могу ли я конвертировать U+56DE U+590D в его однобайтовую последовательность (возможно, 5-6 символов), а затем искать его через strpos? Я не могу понять, как преобразовать его в байты, если так.

Как вы указываете юникод inline в PHP в любом случае? Я имею в виду за пределами PRCE?

$blah="\u56DE\u590D"; не работает?

Спасибо за любые идеи!

2 ответа

Решение

Во-первых, ваш вопрос плохо структурирован. У него есть несколько вопросов в нескольких точках. Вы, вероятно, получили бы больше ответов, если бы использовали более четкую структуру: 1) опишите задачу, которую вы пытаетесь выполнить, 2) ограничения / требования, 3) стратегию, которую вы рассмотрели, 4) трудности, которые вы обнаружили с такой стратегией / есть ли лучший.

Тем не менее, я начну к концу:

$blah="\u56DE\u590D"; не работает?

Нет. Язык ничего не знает о юникоде. В PHP строки являются байтовыми массивами. Следовательно, способ выражения кодовых точек юникода в сценарии PHP зависит от того, какую кодировку вы хотите использовать. Для UTF-8 это было бы "\xE5\x9B\x9E\xE5\xA4\x8D"для UTF-16 big 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. Для UTF-16 с прямым порядком байтов это просто "\x56\xDE\x59\x0D", В противном случае все еще тривиально кодировать их в UTF-32, но для того же в UTF-16 (или UTF-8) требуется немного больше работы.

Для второй части продолжайте читать.

Часть проблемы в том, что я не знаю, как указать код для использования в strpos, и я не знаю, должен ли PHP быть скомпилирован с какой-либо специальной поддержкой кода, или я должен использовать mb_strpos чего я пытаюсь избежать, так как он также может быть недоступен.

Что ты пытаешься сделать? Зачем вам нужно найти позицию в строке? strpos даст вам смещение в байтах для данной строки (опять же, интерпретируется в двоичной форме). Вы пытаетесь обрезать строку? strpos (или даже mb_strpos) проблема в Unicode - глиф может состоять из нескольких единиц кода, поэтому вы рискуете вырезать часть глифа. Я не могу вам больше советовать, если вы не скажете, что пытаетесь сделать.

Вы написали "может быть недоступно". Я предлагаю вам попробовать mb_strpos.

Другие вопросы по тегам