Изменение mbstring.func_overload и internal_encoding
Наши клиенты, установив одну из популярных систем управления сайтом, сталкивались с тем, что данная CMS требовала изменить стандартные настройки параметров PHP mbstring.func_overload и mbstring.internal_encoding.
В частности, система требует прописать настройки:
Почему не меняются mbstring.func_overload и internal_encoding?
Как изменить mbstring.func_overload и internal_encoding?
Изменить настройки mbstring.func_overload и mbstring.internal_encoding в современных конфигурациях можно несколькими способами, но до этого потребуется определиться с тем, какой услугой Вы пользуетесь (хостинг с php, VDS или сервер) и режимом работы php.
Если с первым вопросом проблем не возникнет, то с режимом php несколько сложнее. Узнать о режиме работы можно из функции phpinfo, найдя строку: «Server API», где может быть указано «Apache … Handler» или иное. Значение «Apache … Handler» укажет нам на то, что PHP работает в режиме mod_php, иное значение укажет на режим CGI или аналогичный.
Изменение настроек для режима mod_php
Изменение mbstring.func_overload и mbstring.internal_encoding в режиме модуля Apache на хостинге с PHP можно выполнить, только обратившись в техническую поддержку хостинга.
При использовании своего сервера (VPS/VDS или контейнера) достаточно будет внести изменения в настройки файла httpd.conf в секцию VirtualHost сайта, для которого вносятся изменения, где указать:
Изменение настроек для PHP в иных режимах
Изменить mbstring.func_overload и mbstring.internal_encoding в иных режимах, таких как: CGI, FastCGI и т.д., доступно, как на обычном хостинге, так и на собственном VDS или сервере.
В этом режиме изменение можно произвести простой модификацией пользовательского файла php.ini, где следует указать:
Универсальный метод изменения настроек
Мы сталкивались с конфигурациями систем, на которых отсутствовала возможность изменить параметры mbstring.func_overload и mbstring.internal_encoding, указанными выше методами.
В этом случае для хостинга единственным методом решения проблемы будет обращение в техническую поддержку.
Ошибка: Удалите настройку PHP mbstring.func_overload
При обновлении коробочной версии Битрикс24 вы можете получить уведомление: Для обновления продукта необходимо удалить настройку PHP mbstring.func_overload. Пожалуйста, внесите необходимые изменения или обратитесь в службу технической поддержки вашего хостинга.

Что это значит
Функционал mbstring.func_overload объявлен устаревшим, начиная с PHP 7.2.0, и его использование крайне не рекомендовано.
В связи с этим в продуктах «1С-Битрикс» прекращается поддержка данного параметра PHP. Вы не сможете установить обновления продукта, пока вы не удалите этот параметр в конфигурации PHP вашего сервера.
Что делать
Перейдите в административном меню в раздел Настройки → Инструменты → Диагностика → Настройки PHP:

В открывшем окне найдите в настройках PHP параметр mbstring.func_overload :

Если его значение не равно 0, то вам нужно удалить этот параметр в конфигурации PHP сервера или выставить равным 0 ( mbstring.func_overload=0 ).
Чтобы выполнить эти рекомендации, вам нужно обратиться к вашему системному администратору или хостинг-провайдеру.
То же самое можно сделать и вручную в VMBitrix:
Функции мультибайтных строк
mbstring обеспечивает эти многобайтовые определенные строковые функции, которые помогают Вам иметь дело с многобайтовым кодированием в PHP, который, как предполагается, используется с единственным(отдельным) кодированием байта. В дополнение к этому, mbstring обрабатывает символ, кодирующий преобразование между возможными парами кодирования.
mbstring также предназначен, чтобы обработать кодирование на основе UTF-8 и UCS-2 и других (смотрите ниже), так как mbstring был первоначально разработан для использования в японских web-страницах.
Требования Кодировки Символов PHP4
Вот примеры внутренней кодировки символов, которые работают и НЕ работают с PHP.
Примечание: SJIS не должна использоваться для внутреннего кодирования, если читатель не знаком достаточно хорошо с вопросами работы разборщика/компилятора и кодирования символов.
Примечание: Если вы используете БД с PHP, рекомендуется использовать одну кодировку для БД и internal encoding/внутреннего кодирования для облегчения использования и повышения производительности.
Если вы используете PostgreSQL, он поддерживает кодировки символов, которые отличаются от backend-кодировки. См. детали в учебнике PostgreSQL.
Следующие опции конфигурации имеют отношение к модулю mbstring:
Конвертация кодировки символов HTTP-ввода/вывода может конвертировать также двоичные данные. Пользователям предлагается контролировать конвертацию кодировки символов, если бинарные данные используются для ввода/вывода HTTP.
Пример 1. Отключение конвертации символов HTTP-ввода в php.ini
Примечание: Для пользователей PHP3-i18n: конвертация вывода mbstring отличается от PHP3-i18n. Кодировка символов конвертируется с использованием буфера вывода.
Пример 2. Установки php.ini
Пример 3. Пример скрипта
Вот кодировки, поддерживаемые данным расширением PHP:
Если » pass » установлено, никакая конвертация кодировки символов не выполняется.
Если » auto » установлено, оно расширяется до » ASCII,JIS,UTF-8,EUC-JP,SJIS «.
Примечание: «Поддерживаемые кодировки символов» не означает, что это работает как внутренний код символа.
Приводим значения по умолчанию, устанавливаемые в php.ini
| Директива | Значение по умолчанию |
|---|---|
| mbstring.language | «neutral» |
| mbstring.detect_order | NULL |
| mbstring.http_input | «pass» |
| mbstring.http_output | «pass» |
| mbstring.internal_encoding | NULL |
| mbstring.script_encoding | NULL |
| mbstring.substitute_character | NULL |
| mbstring.func_overload | «0» |
| mbstring.encoding_translation | «0» |
mbstring.internal_encoding определяет внутреннюю кодировку символов по умолчанию
mbstring.http_input определяет кодировку символов по умолчанию HTTP-ввода
mbstring.http_output определяет кодировку символов по умолчанию HTTP-вывода
mbstring.detect_order определяет порядок определения кодировки символов по умолчанию. См. также mb_detect_order()
mbstring.substitute_character определяет символы для замещения неправильных кодировок символов
Web-браузерам предлагается использовать ту же кодировку при отправку форм. Однако браузеры могут не использовать ту же кодировку символов. См. mb_http_input() для определения кодировки браузера.
Если enctype имеет установленное значение multipart/form-data в HTML-формах, mbstring не конвертирует кодировку символов в POST-данных. Пользователь обязан сделать это в скрипте, если конвертация нужна.
Одновременно браузеры достаточно наворочены, чтобы определять кодировку символов в HTML. charset лучше установить в HTTP-шапке/header. Измените default_charset в соответствии с кодировкой символов.
Пример 4. Установки php.ini
Пример 5. Установки php.ini для пользователей EUC-JP
Пример 6. Установки php.ini для пользователей SJIS
Перегрузка/Overload строковых функций PHP mbstring-функциями с поддержкой многобайтных символов
Многобайтное расширение (mbstring) имеет строковые РНР-функции с поддержкой многобайтных символов (например, substr() поддерживает mb_substr() ).
Таблица 1. Перегружаемые функции
| значение mbstring.func_overload | функция-оригинал | перегруженная функция |
|---|---|---|
| 1 | mail() | mb_send_mail() |
| 2 | strlen() | mb_strlen() |
| 2 | strpos() | mb_strpos() |
| 2 | strrpos() | mb_strrpos() |
| 2 | substr() | mb_substr() |
| 4 | ereg() | mb_ereg() |
| 4 | eregi() | mb_eregi() |
| 4 | ereg_replace() | mb_ereg_replace() |
| 4 | eregi_replace() | mb_eregi_replace() |
| 4 | split() | mb_split() |
Для хранения символа можно использовать до 6 байтов.
Некоторые кодировки определяют shift(escape)-последовательность для входа/выхода в/из многобайтных строк.
ISO-2022-JP обязан использоваться для SMTP/NNTP.
«i-mode» web-сайт предполагается использовать с SJIS.
Многобайтные кодировки и связанные с ними вопросы очень сложны. Невозможно рассмотреть их здесь достаточно подробно. Дополнительно просмотрите следующие ресурсы.
информация о символах Japanese/Korean/Chinese
Mbstring func overload что это
Scenario: The default_charset is KOI8-R, and there is a text file «input.txt» containing the string «Это текст для поиска.» in KOI8-R encoding.
A PHP script is written:
// mb_internal_encoding(‘KOI8-R’);
$data = file_get_contents ( ‘input.txt’ );
?>
But unfortunately it was saved as UTF-8.
It doesn’t work; mb_strpos() returns false because it can’t find the UTF-8-encoded «текст» inside the KOI8-R-encoded «Это текст для поиска.».
Adjusting the default_charset had no effect. Not even fiddling with mb_internal_encoding could fix it, simply because the strings involved had *different* encodings and without actually changing one of them they just weren’t going to match.
Either re-save the source file as KOI8-R to match the data file, or re-save the data file as UTF-8 to match the source code. Only then will the script properly echo ‘4’.
The documentation is vague, on WHAT precisely the valid «NLS» language strings are that are valid for «mbstring.language».
( mb_language () ); // «neutral» (default if not set)
var_dump ( mb_language ( ‘uni’ ) ); // TRUE, valid language string
var_dump ( mb_language () ); // «uni»
var_dump ( mb_language ( ‘neutral’ ) ); // TRUE, valid language string
var_dump ( mb_language () ); // «neutral»
?>
Note that you should better at least set «mbstring.internal_encoding».
Just check as below:
?>
You might be surprised at unexpected values.
mbstring.language Japanese
;mbstring.internal_encoding (commented out showing «no value» in phpinfo() )
These two lines in «php.ini» are the same values as
in Win / Linux servers.
«mbstring.internal_encoding» defines the default encoding for «mb_» Functions such as «mb_strlen()».
It also defines the same for «mb_ereg_» Functions such as «mb_ereg()» when you don’t set «mb_regex_encoding».
Где и как можно исправить ситуацию.
Извините за неграмотность.
php_value mbstring.func_overload 0
mbstring.internal_encoding=ISO-8859-1
В русской раскладке всё заработает корректно. Перезагружать сервер не обязательно.
я забил. у меня поставилось. в инет магазине почта не отправляется, не пойму почему. Возможно изза этого.
ps. нет, не изза этого. конфиг этот подправил, все равно не отправляется(причем только при при оформлении заказа в инет магазине)
p.p.s. Почта отправлялась изза того что не хватало памяти. Перешли на тариф с 192 ОЗУ и все заработало.
а если выставлять mbstring = 0, единственный глюк что я нашел:
при включенном режиме правки, пытаемся редактировать параметры компонента, высвечивается окно которое должно быть с параметрами, и в нем сообщение:
«Не удалось обнаружить код вызова компонента.» Приходится править параметры компонента либо в исходнике(в коде вызова компонента), либо через визуальный редактор страницы.
Нет этой строки /etc/php.d/mbstring.ini:
Нельзя ли все это как то решить, раз и навсегда? У разного хостера одно и тоже? и везде надо все подписывать и дописывать?
| Цитата |
|---|
| КОМАН СТИНС написал: Можно mbstring.func_overload изменить «Местечково» например только для заданной папки где у вас работает скрипт требующий ее отключения. Делается на сервере под апачем тут etc/apache2/conf.d/httpd.conf, для виртуальной машины битрикс тут etc/httpd/conf/httpd.conf. Добавляем строки например для папки /personal/promo/ php_admin_value mbstring.func_overload 0 |
Как быть в ситуации когда надо его отключить для собственных печатных форм магазина?
Сами печатные формы лежат в /bitrix/admin/reports, но вызов происходит /bitrix/admin/sale_print.php. соответственно чтобы отключить mbstring.func_overload надо добавить
php_admin_value mbstring.func_overload 0
но в этой папке лежит много другого и результат может быть непредсказуемым
| Цитата |
|---|
| Евгений Крохин написал: На дворе конец 17-го, разрабы всё так-же оставляют этот скелет в шкафу, обосновавшийся там ещё времен безнадежно устаревшей кодировки, и даже мизинцем повести не желают. Это аргумент в «пользу». |
| Цитата |
|---|
| да прям вообще «трагедия века». с учетом того что предоставляется готовое окружение и куча хостеров у которых одной кнопкой можно настроить совместимость сайта с bitrix |
«Уважаемый», не говорите глупостей, чтобы не вам не сказали куда надо пойти.
Во вторых у меня на DEV-сервере крутится куча проектов, который я настраивал под свои нужды в то время, когда ещё ни кто не знал про Битрикс, и уже в то время всё прекрасно работало на UTF-8 безо всяких «сопель». И только Битрикс требует к себе подобного «внимания», сказать, что это настораживает, значит не сказать ни чего.
Данный функционал объявлен УСТАРЕВШИМ начиная с PHP 7.2.0 и его использование крайне не рекомендовано.
Ну т.е. такое. платная, недешевая система вот с такой вот детской болезнью.
В связи с обновлением многие будут искать, оставлю инструкцию что делать:




