Ошибка строковая функция strlen работает некорректно beget

Почему появляется ошибка?

Данная проблема связана с некорректной настройкой кодировки в PHP.

Обычно, для сайтов, работающих на UTF-8, следующие требования по настройке PHP:

  • mbstring.func_overload=2
  • mbstring.internal_encoding=UTF-8
  • default_charset=UTF-8

А для сайтов на windows-1251 требования следующие:

  • mbstring.func_overload=0
  • mbstring.internal_encoding=CP1251
  • default_charset=CP1251

Ошибка говорит о том, что настройки некорректны.

На что эта ошибка влияет?

Данная ошибка, как и в целом ошибки кодировки, являются важными и требуют обязательного решения.

При этом, сайт продолжает работать, что может создать иллюзию бессмысленности решения проблемы. Однако это может проявиться при некоторых ответственных операциях (например, при импорте товаров, или другой работе с каталогом) и привести к различным проблемам.

Также проблемы кодировки могут быть причиной некорректной работы с компонентами в публичной части («Не удалось обнаружить код вызова компонента»).

Как исправить ошибку?

Прежде всего, следует указать правильные конфигурационные параметры PHP — в зависимости от используемой кодировки.

Однако, есть нюансы. Во-первых, для сайтов на кодировке windows-1251 может понадобиться донастройка локали на сервере:

localedef -c -i ru_RU -f CP1251 ru_RU.CP1251 (после этого необходимо перезапустить веб-сервер)

И также в этом случае необходимо прописать локаль в конфиг Битрикса (/bitrix/php_interface/dbconn.php):

setlocale(LC_ALL, ‘ru_RU.CP1251’);
setlocale(LC_NUMERIC, ‘C’);

Но и это еще не всё. На версиях хостингах, при работе на PHP версии 7.3 и выше, ошибка может показываться даже при корректно сделанных настройках — в таком случае рекомендуем использовать версию PHP 7.2.

Требуется наша помощь?

Мы имеем огромный опыт, на протяжении 10 лет помогая клиентам в решении самых различных проблем на их сайтах.

Поэтому, если Вы не имеете возможности решить эту проблему самостоятельно, обращайтесь к нам — мы все сделаем оперативно и квалифицированно.

После обновления версии PHP на сервере с 7.2 до 7.4 появилась ошибка

Параметры настройки UTF (mbstring и константа BX_UTF) (check_mbstring): Fail
Ошибка! Строковая функция strlen работает некорректно.

Настройки сервера были адаптированы под Bitrix, в конфигурационном файле виртуального хоста для apache было указано

php_admin_value mbstring.func_overload 2
    php_admin_value mbstring.internal_encoding UTF-8

Проверка через phpinfo() показывала, что всё включено, но битрикс продолжал выводить ошибку, что функция strlen работает некорректно.

В процессе поисков решения нашлась только информация о том, что ошибка известна, связана с объявлением глобальных переменных, но исправлять её не планируется.

Единственным работающим решением на момент написания заметки является принудительная установка значения mbstring.func_overload 2 в php.ini

Для Debian/Ubuntu файл находится в

/etc/php/7.4/apache2/php.ini

Необходимо раскоментировать строку (удалив символ;) и установить значение

mbstring.func_overload = 2

После этого ошибка исчезает.

Предупреждение: если кроме битрикса используете другие cms или фреймворки, из-за глобального параметра могут быть проблемы в их работе, т.к. рекомендуемое значение данного параметра 0 — т.е. не используется. Например проблемы могут возникать с некоторыми версиями phpmyadmin, шаблонизатором twig

Мне на сервере обновили php до 7.4.9 и попросили обновить битрикс до самого свежего, всё выполнилось нормально за исключением одного вот этого момента. При проверке системы в поле `Параметры настройки UTF (mbstring и константа BX_UTF)` вылезает ошибка `Ошибка! Строковая функция strlen работает некорректно.` в файле php.ini задал
полю mbstring.func_overload значение 2, в .htaccess тоже написал эту строку. В dbconn пробовал писать `setlocale(LC_ALL, ‘ru_RU.CP1251′); setlocale(LC_NUMERIC,’C’);` не помогло. В init.php добавил строку `mb_internal_encoding(‘utf-8’);` тоже не помогло. Вообще сервер выдаёт такую инфу об mbstring5f438a7c45283745105448.png
Не представляю уже, как решить эту задачу, очень прошу помочь, потому что остальные задачи стоят, а корпею я над этим вопросом уже дня 2


  • Вопрос задан

    более года назад

  • 350 просмотров

Рекомендация 1

Данная ошибка может возникнуть при не корректной настройки сервера под Битрикс, а именно значения директив mbstring.func_overload и  mbstring.internal_encoding должны быть установлены 2 и UTF-8 соответственно. Если у Вас есть доступ к php.ini эта настройка делается в данном файле. Например на хостинге beget, есть возможность изменить их настройки в панеле управления, непосредственно в настройках сайта. Если же нет возможности изменить значения на сервере, можно добавить директивы в файл .htaccess 

На практике это выглядит так (две последние строчки): 

<IfModule mod_php7.c>
  php_flag allow_call_time_pass_reference 1
  php_flag session.use_trans_sid off
  php_value display_errors off
  #php_value display_errors 1

  php_value mbstring.internal_encoding UTF-8
  php_value mbstring.func_overload 2
</IfModule>

Подобных статей по настройке сервера под битрикс предостаточно и я скорее-всего не стал бы делать еще одну заметку на эту тему, если бы эти настройки сработали.

Рекомендация 2

В моём случае настройки на сервере уже были какие требуются, но проблема оставалась, на некоторых ресурсах рекомендация была такая. Нужно чтобы код php и закрывающие теги были отделены от html тегов, а так же код компонентов был отделён от Вашего  php кода, например условий. PS^ У меня было множество проектов где наблюдалось нарушение этого условия, но темнемение, компонент вызывался нормально, во всяком случае попробуйте выполнить это условие. 

Рекомендация 3

Выполните тест системы в панели управления Битрикса Рабочий стол>Настройки>Инструменты>Проверка системы : 

Здесь нас интересует пункт (Параметры настройки UTF (mbstring и константа BX_UTF)), функция должна работать нормально, а работать она будет нормально при правильных настройках из первой рекомендации. При этом константа BX_UTF в файле .settings.php и dbconn.php была установлена true. Ошибка гласила что данная функция работает неправильно. Я попробовал установить значение данной константы false.

Файл .settings.php

Файл dbconn.php

Далее нужно выполнить проверку еще раз и появится следующая ошибка 

После проверки константе нужно вновь вернуть значение true в первом и втором файле. После этих манипуляций ошибка как ни странно пропала. 

Еще есть вариант такой, можно попробовать сменить версию php, проблема именно  в этом, если у Вас 7.3 попробуйте сменить на 7.2 или 7.4 т.к. именно в php версии 7.3 у пользователей наблюдалась  проблема такого характера.

PHP functions strlen() and mb_strlen() both are returning the wrong number of characters when I run them on a string.

Here is a piece of the code I’m using…

 $foo = mb_strlen($itemDetails['ITEMDESC'], 'UTF-8');
 echo $foo;

It is telling me this sting — «4½» Straight Iris Scissors» is 45 characters long. It’s 27.

It also tells me that this string — «Infant Heel Warmer, No Adhesive Attachment Pad, 100/cs» is 54, which is correct.

I assume its some issue with character encoding, everything should be UTF-8 I think. I’ve tried feeding mb_strlen() several different character encoding types and they all are returning this oddball count with the string that has those non-standard characters.

I’ve no idea why this is happening.

asked Jul 5, 2011 at 22:42

Bead's user avatar

2

Double-check whether your text really is UTF-8 or not. That «Â» character makes it look like a classic character encoding problem to me. You should check the entire path from the origin of the text through the point in your code that you quoted above, because there are a lot of places where the encodings can get munged.

Did the text originate from an HTML form? Ensure your <form> element includes the accept-charset="UTF-8" attribute.

Did the text get stored in a database along the way? Make sure the database stores and returns the data in UTF-8. This means checking the server’s global defaults, the defaults for the database or schema, and the table itself.

answered Jul 5, 2011 at 23:31

curtisdf's user avatar

curtisdfcurtisdf

4,0824 gold badges30 silver badges42 bronze badges

1

It is very likely that your input is encoded in UTF-16.
You may convert to UTF-8

$foo = mb_strlen(mb_convert_encoding($itemDetails['ITEMDESC'], "UTF-8", "UTF-16"));

or if you use mb_strlen() be sure to use proper encoding as a second parameter.

$foo = mb_strlen($itemDetails['ITEMDESC'], "UTF-16");

Without correct encoding mb_strlen will always return wrong results. It’s easy to get into troubles when you’re dealing with UTF-8/16/32 encoded strings. mb_detect_encoding() will not solve this problem.

answered Apr 27, 2012 at 23:48

opengrid's user avatar

opengridopengrid

1,9424 gold badges16 silver badges25 bronze badges

  • goodprogrammist

После миграции на php74 возникает сабж в журнале проверки системы.
Как результат, перестал работать обмен с 1С.
Советы из контекстного хэлпа в журнале проверки к решению не привели.

5e52d020eb837121159596.png


  • Вопрос задан

    более трёх лет назад

  • 4343 просмотра

Сталкивался с такой проблемой.
Решение в лоб: прописать mbstring.func_overload 2 в файле php.ini глобально, а не в конфиге веб сервера или fpm.
Видимо это какой то баг php, который никто фиксить уже не будет

Пригласить эксперта


  • Показать ещё
    Загружается…

25 июн. 2023, в 11:42

600 руб./за проект

25 июн. 2023, в 10:30

6000 руб./за проект

25 июн. 2023, в 10:26

15000 руб./за проект

Минуточку внимания

Почему появляется ошибка?

Данная проблема связана с некорректной настройкой кодировки в PHP.

Обычно, для сайтов, работающих на UTF-8, следующие требования по настройке PHP:

  • mbstring.func_overload=2
  • mbstring.internal_encoding=UTF-8
  • default_charset=UTF-8

А для сайтов на windows-1251 требования следующие:

  • mbstring.func_overload=0
  • mbstring.internal_encoding=CP1251
  • default_charset=CP1251

Ошибка говорит о том, что настройки некорректны.

На что эта ошибка влияет?

Данная ошибка, как и в целом ошибки кодировки, являются важными и требуют обязательного решения.

При этом, сайт продолжает работать, что может создать иллюзию бессмысленности решения проблемы. Однако это может проявиться при некоторых ответственных операциях (например, при импорте товаров, или другой работе с каталогом) и привести к различным проблемам.

Также проблемы кодировки могут быть причиной некорректной работы с компонентами в публичной части («Не удалось обнаружить код вызова компонента»).

Как исправить ошибку?

Прежде всего, следует указать правильные конфигурационные параметры PHP — в зависимости от используемой кодировки.

Однако, есть нюансы. Во-первых, для сайтов на кодировке windows-1251 может понадобиться донастройка локали на сервере:

localedef -c -i ru_RU -f CP1251 ru_RU.CP1251 (после этого необходимо перезапустить веб-сервер)

И также в этом случае необходимо прописать локаль в конфиг Битрикса (/bitrix/php_interface/dbconn.php):

setlocale(LC_ALL, ‘ru_RU.CP1251’);
setlocale(LC_NUMERIC, ‘C’);

Но и это еще не всё. На версиях хостингах, при работе на PHP версии 7.3 и выше, ошибка может показываться даже при корректно сделанных настройках — в таком случае рекомендуем использовать версию PHP 7.2.

Требуется наша помощь?

Мы имеем огромный опыт, на протяжении почти 15 лет помогая клиентам в решении самых различных проблем на их сайтах, в т.ч. самых сложных.

Поэтому, если Вы не имеете возможности решить эту проблему самостоятельно, обращайтесь к нам — мы поможем.

После обновления версии PHP на сервере с 7.2 до 7.4 появилась ошибка

Параметры настройки UTF (mbstring и константа BX_UTF) (check_mbstring): Fail
Ошибка! Строковая функция strlen работает некорректно.

Настройки сервера были адаптированы под Bitrix, в конфигурационном файле виртуального хоста для apache было указано

php_admin_value mbstring.func_overload 2
    php_admin_value mbstring.internal_encoding UTF-8

Проверка через phpinfo() показывала, что всё включено, но битрикс продолжал выводить ошибку, что функция strlen работает некорректно.

В процессе поисков решения нашлась только информация о том, что ошибка известна, связана с объявлением глобальных переменных, но исправлять её не планируется.

Единственным работающим решением на момент написания заметки является принудительная установка значения mbstring.func_overload 2 в php.ini

Для Debian/Ubuntu файл находится в

/etc/php/7.4/apache2/php.ini

Необходимо раскоментировать строку (удалив символ;) и установить значение

mbstring.func_overload = 2

После этого ошибка исчезает.

Предупреждение: если кроме битрикса используете другие cms или фреймворки, из-за глобального параметра могут быть проблемы в их работе, т.к. рекомендуемое значение данного параметра 0 — т.е. не используется. Например проблемы могут возникать с некоторыми версиями phpmyadmin, шаблонизатором twig

Здравствуйте, восстановил из бэкапа сайт, в поле «Параметры настройки UTF (mbstring и константа BX_UTF)»  вылезра ошибка — ‘Ошибка! Строковые функции работают некорректно.Такая ситуация может возникать из-за ошибки в PHP 5.6 (

https://bugs.php.net/bug.php?id=68644

), в этом случае надо установить более раннюю или более позднюю версию PHP.’ пробовал всякие варианты, то всё падает, то не помогает.. прошу помочь разобраться с этим. Ошибка, которую выводит php на самом сайте выглядит так ‘Call to undefined function mb_orig_strtolower()’  

  • Ошибка строка 1 не указаны мероприятия сотрудника
  • Ошибка стиральной машины ханса p06
  • Ошибка стрим лабс ошибка при выводе
  • Ошибка стрелка 6 букв сканворд
  • Ошибка стратега 7 букв