带有特殊字符的PHP strtolower(如:äüö)

时间:2014-11-08 18:01:57

标签: php encoding utf-8

我在PHP中将字符串转换为小写时遇到问题,因为它包含一个特殊的字符串,在这种情况下尤其是变音字符,因为我正在处理名称。这里的用例是我在数组中搜索名称,其中数据库中已经存在的名称都是小写的(实际上是由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

1 个答案:

答案 0 :(得分:1)

首先调用mb_internal_encoding告诉多字节函数您希望它们运行的​​编码:

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

或者将编码参数直接传递给mb_strtolower

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