У меня есть проблема в PHP, преобразующая строку в нижний регистр, когда она содержит специальный символ, в данном случае особенно умлауты, поскольку я имею дело с именами. В этом случае я ищу имя в массиве, в котором имена allready existant в базе данных помещаются в нижний регистр (фактически выполняется strtolower
который отлично работает).
Проблема заключается в том, что преобразование в нижний регистр не выполняется для специальных символов, что очень странно, поскольку оно работает с именами из базы данных, и в обоих случаях вход является utf8. Я даже проверил кодировку с mb_detect_encoding($name)
которая возвращает UTF-8
.
// All names from the database are read into an array, mysql charset is utf8
foreach($db_names as $namerow) {
$name = $namerow['lastname'] .' '. $namerow['firstname'];
$allnames[strtolower($name)] = $namerow['id']; // works
}
// Get data from a webservice which return utf-8 encoded data (i checked that)
$data = ...;
// Test the utf-8
header('Content-Type: text/html; charset=utf-8');
print_r($allnames); // everything is correct here
var_dump(strtolower($data['name'])); // Output i.e. rÖmer - notice still uppercase char
var_dump(mb_strtolower($data['name'])); // Output with strange ? character - r?mer
var_dump(mb_detect_encoding($data['name'])); // Output: UTF-8
mb_internal_encoding
чтобы сообщить многобайтовой функции, какую кодировку вы хотите использовать:
mb_internal_encoding('UTF-8');
var_dump(mb_strtolower($data['name']));
Или передайте аргумент кодирования непосредственно в mb_strtolower
:
var_dump(mb_strtolower($data['name'], 'UTF-8'));
mbstring.internal_encoding
.