Другие решения
Preg split потерпит неудачу из-за очень больших строк с исключением памяти и mb_substr действительно медленный, так что вот простой и эффективный код, который, я уверен, вы могли бы использовать:
Это я использовал для циклического прохождения по многобайтовой строковой переменной char по char, и если я изменил ее на код ниже, разница в производительности огромна:
Использование его для зацикливания строки 10000 раз с приведенным ниже кодом дает 3-секундную среду выполнения для первого кода и 13 секунд для второго кода:
31
С помощью Лайос Месарос«Прекрасная функция для вдохновения. Я создал многобайтовый класс итераторов строк.
Это можно использовать так
Который будет выводить
Или, если вы действительно хотите знать позицию начального байта, а также
Который будет выводить
6
Вы можете проанализировать каждый байт строки и определить, является ли он одним (ASCII) символом или начало многобайтового символа:
вы бы прошли строку и вместо увеличения позиции на 1 прочитали текущий символ полностью, а затем увеличили бы позицию на длину, которую имел символ.
В статье Википедии есть таблица интерпретации для каждого символа :
3
У меня была та же проблема, что и у OP, и я стараюсь избегать регулярных выражений в PHP, так как он не работает или даже падает с длинными строками. я использовал Mészáros Lajos ‘ответ с некоторыми изменениями, так как у меня есть установить на 7.
С установить на 7, на самом деле звонки , Так получает правильное значение в этом случае. Мне пришлось добавить второй указатель. Один отслеживает многобайтовый символ в строке, другой отслеживает однобайтовый символ. Многобайтовое значение используется для (так как это на самом деле ), в то время как однобайтовое значение используется для извлечения байта следующим образом: ,
Очевидно, что если PHP когда-либо решит исправить доступ [] для правильной работы с многобайтовыми значениями, это не удастся. Но также это исправление не понадобится в первую очередь.
2
Я думаю, что наиболее эффективным решением было бы работать через строку, используя mb_substr. На каждой итерации цикла mb_substr будет вызываться дважды (чтобы найти следующий символ и оставшуюся строку). Он будет передавать только оставшуюся строку для следующей итерации. Таким образом, основными накладными расходами в каждой итерации будет поиск следующего символа (выполняется дважды), что занимает от одной до пяти или около того операций, в зависимости от длины байта символа.
Если это описание не понятно, дайте мне знать, и я предоставлю работающую функцию PHP.
1
Patchwork\Utf8
Some more functions are also provided to help handling UTF-8 strings:
- isUtf8(): checks if a string contains well formed UTF-8 data,
- toAscii(): generic UTF-8 to ASCII transliteration,
- strtocasefold(): unicode transformation for caseless matching,
- strtonatfold(): generic case sensitive transformation for collation matching,
- strwidth(): computes the width of a string when printed on a terminal,
- wrapPath(): unicode filesystem access under Windows and other OSes.
Mirrored string functions are: strlen, substr, strpos, stripos, strrpos, strripos, strstr, stristr, strrchr, strrichr, strtolower, strtoupper, wordwrap, chr, count_chars, ltrim, ord, rtrim, trim, str_ireplace, str_pad, str_shuffle, str_split, str_word_count, strcmp, strnatcmp, strcasecmp, strnatcasecmp, strncasecmp, strncmp, strcspn, strpbrk, strrev, strspn, strtr, substr_compare, substr_count, substr_replace, ucfirst, lcfirst, ucwords, number_format, utf8_encode, utf8_decode, json_decode, filter_input, filter_input_array.
Notably missing (but hard to replicate) are printf-family functions.
The implementation favors performance over full edge cases handling. It generally works on UTF-8 normalized strings and provides filters to get them.
As the turkish locale requires special cares, a class is provided for working with this locale. It clones all the features of but knows about the turkish specifics.
Parameter Values
Parameter | Description |
---|---|
string | Required. Specifies the string to return a part of |
start | Required. Specifies where to start in the string
|
length | Optional. Specifies the length of the returned string. Default is to the end of the string.
|
Portability
Unicode handling in PHP is best performed using a combo of , , and with the flag enabled. But when an application is expected to run on many servers, you should be aware that these 4 extensions are not always enabled.
Patchwork UTF-8 provides pure PHP implementations for 3 of those 4 extensions. compiled with unicode support is required but is widely available. The following set of portability-fallbacks allows an application to run on a server even if one or more of those extensions are not enabled:
- utf8_encode, utf8_decode,
- : mb_check_encoding, mb_convert_case, mb_convert_encoding, mb_decode_mimeheader, mb_detect_encoding, mb_detect_order, mb_encode_mimeheader, mb_encoding_aliases, mb_get_info, mb_http_input, mb_http_output, mb_internal_encoding, mb_language, mb_list_encodings, mb_output_handler, mb_strlen, mb_strpos, mb_strrpos, mb_strtolower, mb_strtoupper, mb_stripos, mb_stristr, mb_strrchr, mb_strrichr, mb_strripos, mb_strstr, mb_strwidth, mb_substitute_character, mb_substr, mb_substr_count,
- : iconv, iconv_mime_decode, iconv_mime_decode_headers, iconv_get_encoding, iconv_set_encoding, iconv_mime_encode, ob_iconv_handler, iconv_strlen, iconv_strpos, iconv_strrpos, iconv_substr,
- : Normalizer, grapheme_extract, grapheme_stripos, grapheme_stristr, grapheme_strlen, grapheme_strpos, grapheme_strripos, grapheme_strrpos, grapheme_strstr, grapheme_substr, normalizer_is_normalized, normalizer_normalize.
Usage
Then, early in your bootstrap sequence, you have to configure your environment:
\Patchwork\Utf8\Bootup::initAll(); // Enables the portablity layer and configures PHP for UTF-8 \Patchwork\Utf8\Bootup::filterRequestUri(); // Redirects to an UTF-8 encoded URL if it's not already the case \Patchwork\Utf8\Bootup::filterRequestInputs(); // Normalizes HTTP inputs to UTF-8 NFC
Run to see the code in action.
Do not blindly replace all use of PHP’s string functions. Most of the time you will not need to, and you will be introducing a significant performance overhead to your application.
This library is orthogonal to and will not work if the php.ini setting is enabled.
HTTP ввод и вывод
Конвертация кодировки символов HTTP-ввода/вывода может конвертировать также двоичные данные. Пользователям предлагается контролировать конвертацию кодировки символов, если бинарные данные используются для ввода/вывода HTTP.
Если enctype для HTML-формы установлен multipart/form-data, mbstring не конвертирует кодировку символов в POST-данных. Если это так, строки должны конвертироваться во внутреннюю кодировку символов.
-
HTTP-ввод
Нет способов управлять конвертацией символов HTTP-ввода из PHP-скрипта. Отключение конвертации символов HTTP-ввода нужно сделать в php.ini.
Пример 1. Отключение конвертации символов HTTP-ввода в php.ini
;; Отключить конвертацию HTTP Input mbstring.http_input = pass
При использовании PHP как Apache-модуля можно переопределять PHP ini-установку на уровне Virtual Host в httpd.conf или на уровне директории в .htaccess. Обратитесь к разделу Конфигурация и учебнику Apache.
-
HTTP-вывод
Есть несколько способов включить конвертацию кодировки символов вывода. Один — это использование php.ini, другой — функция ob_start() с mb_output_handler() как ob_start callback-функция.
Пример 2. Установки php.ini
|
Пример 3. Пример скрипта
|
С этим читают
- Substring (transact-sql)substring (transact-sql)
- Статический анализ php-кода на примере phpstan, phan и psalm
- Что такое windows-1251 кодировка и как ее применять
- Сравнение производительности версий php
- Python string isupper islower upper lower functions example
- Глобальные переменные в wordpress
- Вспомогательные классы для работы со строками в java
- Как настроить отображение ошибок в php
- Отправка e-mail в php
- Как увеличить лимит php памяти в wordpress