Строки 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
с вышеуказанной строкой?
Ответы
Ответ 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);