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.