ytrewq123 пишет:Не знаю точно как она работает. Но есть такая функция
mb_internal_encoding("utf-8");
Вы совершенно правы.
В функциях mb_ есть необязательный последний параметр для указания используемой кодировки. По-умолчанию используется та кодировка, которая задана ранее с помощью mb_internal_encoding.
Если кодировка ранее задана не была, то используется параметр конфигурации
mbstring.internal_encoding, если такой есть. Начиная с 5.6.0 этот параметр deprecated
С версии 5.6.0 используется default_charset, если только не объявлен mbstring.internal_encoding
Замечу, и это очень важно в контексте вопроса, до 5.6.0 по умолчанию использовалась однобайтовая кодировка ISO-8859-1. При этом, понятное дело, для какой-то входной байтовой последовательности mb_strlen считает, что работает с указанной однобайтовой кодировкой и выдаёт правильный результат именно для этой кодировки. Но неправильный результат для стороннего наблюдателя, знающего, что входной массив байт был в UTF8.
С iconv_strlen ситуация аналогичная, только другие функции и параметры.