首页 > 试题广场 >

PHP的strtolower()和strtoupper()函

[问答题]

PHP的strtolower()和strtoupper()函数为什么在非中文系统的服务器下可能会导致汉字乱码?请写两个替代的函数实现兼容Unicode文字的字符串大小写转换。

<?php
/**
 * PHP的strtolower()和strtoupper()函数为什么在非中文系统的服务器下可能会导致汉字乱码
 * 解决思路是英文字符通过ascii码表去转换,中文字符忽略
 */

/**
 * 字符串转大写
 * @param $str
 * @return false|mixed|string
 */
function stringToUpper($str)
{
    if (!is_string($str)) {
        return false;
    }
    $chars = str_split($str, 1);
    $resultStr = '';
    foreach ($chars as $char)
    {
        $asciiChar = ord($char);
        if ($asciiChar >= ord('a') && $asciiChar <= ord('z')) {
            $asciiChar += ord('A') - ord('a');
            $char = chr($asciiChar);
        }
        $resultStr .= $char;
    }
    return $resultStr;
}

/**
 * 字符串转小写
 * @param $str
 * @return false|string
 */
function stringToLower($str)
{
    if (!is_string($str)) {
        return false;
    }
    $chars = str_split($str, 1);
    $resultStr = '';
    foreach ($chars as $char)
    {
        $asciiChar = ord($char);
        if ($asciiChar >= ord('A') && $asciiChar <= ord('Z')) {
            $asciiChar -= ord('A') - ord('a');
            $char = chr($asciiChar);
        }
        $resultStr .= $char;
    }
    return $resultStr;
}

$str = 'Abc中文';
echo stringToUpper($str);
echo stringToLower($str);

编辑于 2021-04-15 13:48:18 回复(0)
可以使用`mb_strtolower()`和`mb_strtoupper()`函数
function myStrToUpper($str)
{
    $b = str_split($str, 1);
    $r = '';
    foreach ($b as $v) {
        $v = ord($v);
        if ($v >= 97 && $v <= 122) {
            $v -= 32;
        }
        $r .= chr($v);
    }
    return $r;
}


发表于 2021-02-25 17:30:34 回复(0)