PHP:走向多字节

WBOY
发布: 2024-08-12 08:35:32
原创
744 人浏览过

PHP: Going multibytes

多字节字符在编程中可能很棘手。

警告

mbstring 默认情况下不启用。确保您之前阅读过该部分。

为什么要费心多字节字符串呢?

文档可以包含多字节字符串。虽然 PHP 有很多有用的字符串帮助器,但这些帮助器根本不适用于多字节字符串。

它可能会导致讨厌的错误和其他意外错误,尤其是在计算字符时。

这就是为什么您宁愿在 PHP 中使用多字节字符串函数。

此外,新的多字节字符串函数,例如 mb_trim、mb_ltrim 和 mb_rtrim 将在 8.4(撰写本文时 PHP 的下一个版本)中提供。

为什么有些字符需要多个字节?

英语使用 ASCII 字符集,因此像 r 或 s 这样的字母只需要一个字节。

相反,有些语言使用需要超过 1 个字节的字符,例如汉字(最多可达 6 个字节!)。

几个例子

计数字符

$strings = [
    "?????",
    "チャーミング",
    "González",
];

foreach ($strings as $string) {
    echo 'strlen:' . strlen($string) . ' vs. mb_strlen:' . mb_strlen($string) . PHP_EOL;
}
登录后复制

寻找位置

echo strpos("チャーミング", "ャ"); // gives 3
echo mb_strpos("チャーミング", "ャ"); // gives 1 because 1st position is 0
登录后复制

剪断绳子

echo substr("チャーミング", 3) . PHP_EOL;// ャーミング
echo mb_substr("チャーミング", 3);// ミング
登录后复制

对性能的影响

您可能会读到 mbstring 函数可以产生重大影响。

您甚至可以使用以下脚本重现它:

$cnt = 100000;

$strs = [
    'empty' => '',
    'short' => 'zluty kun',
    'short_with_uc' => 'zluty Kun',
    'long' => str_repeat('this is about 10000 chars long string', 270),
    'long_with_uc' => str_repeat('this is about 10000 chars long String', 270),
    'short_utf8' => 'žlutý kůň',
    'short_utf8_with_uc' => 'Žlutý kŮň',
];

foreach ($strs as $k => $str) {
    $a1 = microtime(true);
    for($i=0; $i < $cnt; ++$i){
        $res = strtolower($str);
    }
    $t1 = microtime(true) - $a1;
    // echo 'it took ' . round($t1 * 1000, 3) . ' ms for ++$i'."\n";

    $a2 = microtime(true);
    for($i=0; $i < $cnt; $i++){
        $res = mb_strtolower($str);
    }
    $t2 = microtime(true) - $a2;
    // echo 'it took ' . round($t2 * 1000, 3) . ' ms for $i++'."\n";

    echo 'strtolower is '.round($t2/$t1, 2).'x faster than mb_strtolower for ' . $k . "\n\n";
}
登录后复制

来源:PHP 错误

mb_* 函数速度较慢,但​​这始终是一种权衡,只有上下文才能决定您是否应该使用这些帮助器还是创建自己的帮助器。

例如,如果替换 $cnt = 100000;通过 $cnt = 100;在上面的脚本中, mb_* 助手仍然明显较慢,但在您的情况下,最终的影响可能很好(例如,0.008 毫秒与 0.004 毫秒)。

包起来

您必须考虑多字节,尤其是在多语言上下文中,PHP 对此有内置的帮助程序。

以上是PHP:走向多字节的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板