PHP strtolower с конкретным символом (например: äüö)

0

У меня есть проблема в 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
Теги:
utf-8
encoding

1 ответ

0
Лучший ответ

mb_internal_encoding чтобы сообщить многобайтовой функции, какую кодировку вы хотите использовать:

mb_internal_encoding('UTF-8');
var_dump(mb_strtolower($data['name']));

Или передайте аргумент кодирования непосредственно в mb_strtolower:

var_dump(mb_strtolower($data['name'], 'UTF-8'));
  • 0
    Потребовалось время, чтобы найти время, чтобы попробовать, но ваш ответ идеален. Использует ли он параметр iconv.internal_encoding в php? Также очень странно, что strtolower может работать с utf8 из базы данных, но не из внешнего интерфейса ...
  • 0
    Он использует настройку ini mbstring.internal_encoding .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню