【问题标题】:PHP strtolower with specical char (like: äüö)带有特殊字符的 PHP strtolower(如:äüö)
【发布时间】:2014-11-08 18:01:57
【问题描述】:

当我处理包含特殊字符时,我在 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

【问题讨论】:

    标签: php encoding utf-8


    【解决方案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'));
    

    【讨论】:

    • 花了一段时间才找到时间尝试,但你的答案是完美的。它是否使用 php 的 iconv.internal_encoding 设置?也很奇怪的是 strtolower 可以使用数据库中的 utf8 但不能使用外部 api...
    • 它使用mbstring.internal_encoding ini 设置。
    猜你喜欢
    • 2019-09-17
    • 2012-10-23
    • 2012-04-16
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2012-02-15
    相关资源
    最近更新 更多