Utf 8

Другие решения

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
  • A positive number — Start at a specified position in the string
  • A negative number — Start at a specified position from the end of the string
  • 0 — Start at the first character in string
length Optional. Specifies the length of the returned string. Default is to the end of the string.
  • A positive number — The length to be returned from the start parameter
  • Negative number — The length to be returned from the end of the string
  • If the length parameter is 0, NULL, or FALSE — it return an empty 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

;; Включить конвертацию кодировки символов для всех страниц PHP

;; Включить буферизацию вывода
output_buffering    = On

;; Установить mb_output_handler для включения конвертации вывода
output_handler      = mb_output_handler

Пример 3. Пример скрипта

<?php

// Включить конвертацию кодировки символов только для данной страницы

// Установить кодировку символов HTTP-вывода для SJIS
mb_http_output('SJIS');

// Начать буферизацию и специфицировать "mb_output_handler" как
// callback-функцию
ob_start('mb_output_handler');

?>

С этим читают