周梦康 发表于 2018-05-21 587 次浏览 标签 : unicode

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

看网上的 php 版的 utf8 字符和 unicode 互转的代码都有问题(都是复制的一个人的版本)。
都是只处理三字节的情况,实际就算用来处理中文,也不对,因为中文也可能有四个字节,详情可以查看 https://www.unicode.org/charts/unihangridindex.html

所以大家不能只 fork 而不去理解。

在看下面的代码之前,可以先补习下 unicode 和 utf8 之间的关系,还是很有必要的
参考 http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

function utf8_to_unicode($character)
{
    $unicode = null;

    for ($i = 0, $length = strlen($character); $i < $length; $i++) {
        if ($i == 0) {
            if ($length == 1) {
                $unicode = ord($character[$i]);
            } else {
                $unicode = (ord($character[$i]) & (0x1f >> ($length - 2))) << 6 * ($length - ($i + 1));
            }
        } else {
            $unicode |= (ord($character[$i]) & 0x3F) << 6 * ($length - ($i + 1));
        }
    }

    return dechex($unicode);
}

function unicode_to_utf8($unicode_str)
{
    $num = hexdec($unicode_str);

    if($num < 0x7f) {
      // 0xxxxxxx
      return chr($num);
    }else if ($num < 0x7ff) {
      // 110xxxxx 10xxxxxx
      return chr(0xc0 | ($num >> 6)). chr(0x80 | ($num & 0x3f));
    } else if ($num < 0xffff) {
      // 1110xxxx 10xxxxxx 10xxxxxx
      return chr(0xe0 | ($num >> 12)). chr(0x80 | (($num >> 6) & 0x3f)) . chr(0x80 | ($num & 0x3f));
    } else {
      // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
      return chr(0xf0 | ($num >> 18)). chr(0x80 | (($num >> 12) & 0x3f)) . chr(0x80 | (($num >> 6) & 0x3f)) . chr(0x80 | ($num & 0x3f));
    }
}

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表