Подтвердить что ты не робот

Строки mb_strtolower и utf8

Как вы знаете, нам нужно использовать mb_strtolower() вместо strtolower() когда мы работаем с данными utf-8:

$str = 'برنامه';
echo strtolower($str);
----------------------
output: �����

Все пошло на неопределенные символы, теперь я использую mb_strtolower()

$str = 'برنامه';
echo mb_strtolower($str);
----------------------
output: �����

все те же результаты, теперь:

$str = 'برنامه';
echo mb_strtolower($str,  mb_detect_encoding($str));
----------------------
output: برنامه

Теперь это исправлено, поэтому способ использования mb_strtolower - это также наличие mb_detect_encoding.

Теперь моя проблема в том, что я хочу сделать то же самое с array_map:

$results_array = array_map('mb_strtolower', $results_array);

Как я должен использовать mb_detect_encoding с вышеуказанной строкой?

4b9b3361

Ответ 1

Решение состоит в том, чтобы сообщить mb_strtolower, что такое строковое кодирование:

echo mb_strtolower($str, 'UTF-8');

Если вы не хотите каждый раз указывать этот параметр, установите его один раз для всех функций mb_:

mb_internal_encoding('UTF-8');

Затем вы можете вызвать любую функцию mb_, и она будет обрабатывать вашу строку как UTF-8:

echo mb_strtolower($str); // works without second parameter now

mb_detect_encoding происходит возврат 'UTF-8', потому что он обнаружил его, но он, как правило, ненадежный, поскольку концептуально невозможно надежно обнаружить произвольно закодированные строки. Знайте, что ваши строки закодированы и передают эту информацию явно.

Ответ 2

Проще говоря, определите свою собственную функцию, которая затем вызывает mb_strtolower с помощью mb_detect_encoding.

$results_array = array_map(function($var) {
      return mb_strtolower($var, mb_detect_encoding($var));
}, $results_array);