我在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 :(得分: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'));