2014-11-08 95 views
0

我有问题在PHP中将字符串转换为小写,当它包含一个特殊的字符,在这种情况下,尤其是元音变形,因为我正在处理名称。这里的用例是我正在搜索数组中的名字,其中数据库中所有已存在的名字都被放在小写字母中(实际上由strtolower完成,它工作正常)。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 

回答

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

花了一段时间找时间尝试,但你的答案是完美的。它使用php的iconv.internal_encoding设置吗?也很奇怪的是,strtolower可以使用utf8从数据库,但不是从外部API ... – patman 2014-11-14 16:52:47

+0

它使用'mbstring.internal_encoding' ini设置。 – Boann 2014-11-14 16:59:24