我们已经准备好了,你呢?

2026我们与您携手共赢,为您的企业形象保驾护航!

最近正好需要用到编码转换,于是查了一下PHP的库函数,没有找到可以对字符串进行编码和解码的函数! 好吧,如果你找不到它,那就自己实现吧。 。 .Utf-8编码与Utf-8编码的区别

它是一种字符集,UTF-8就是其中之一。 它是固定长度并且是双字节的,而UTF-8是可变的。 对于汉字来说,它比UTF-8占用更多的字节。 少 1 个字节。 是双字节,而UTF-8中的汉字占用三个字节。

UTF-8编码的字符理论上最多可以有6个字节长,但16位BMP(Basic Plane)字符最多只能有3个字节长。 我们看一下UTF-8编码表:

U-00000000 - U-0000007F: 0xxxxxxx U-00000080 - U-000007FF: 110xxxxx 10xxxxxx U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 

登录后复制

xxx 的位置由字符编码数的二进制表示形式所表示的位填充。 越往右,x 的特殊含义就越少。 仅用最短的一个来表示一个字符编码数的多字节字符串。 注意,在多字节字符串中,第一个字节开头的“1”的数量就是整个字符串的字节数。 第一行以0开头是为了兼容ASCII编码,是一个字节,第二行是双字节字符串,第三行是3个字节,比如汉字等等。 (个人观点:其实我们可以简单的把前面1的个数看成字节数)

如何转换为 UTF-8

为了转换为UTF-8,你当然需要知道其中的区别。 我们来看一下in的编码是如何转换为UTF-8的。 在UTF-8中,如果一个字符的字节小于0x80(128),那么它就是一个ASCII字符,占用一个字节,不需要转换,因为UTF-8兼容ASCII编码。 如果汉字“你”的编码是“u4F60”,则将其转换为二进制为0000,然后按照UTF-8的方法进行转换。 二进制数可以从低位到高位取出,一次取出6位。 例如,可以将上述二进制数取出为如下所示的格式。 前面的按照格式填充,不足8位的用0填充。

unicode: 100111101100000                   4F60utf-8:    11100100,10111101,10100000       E4BDA0

登录后复制

从上面可以直观的看到到UTF-8的转换。 当然,知道了UTF-8的格式之后,就可以进行逆操作了,即根据格式在二进制中对应的位置取出来,然后转换就是得到的字符(这个操作可以是通过“位移”完成)。 例如上面“you”的转换,由于其值大于0x800且小于0x800,所以可以判断为三字节存储。 那么最高位需要右移“12”位,那么三字节格式中的最高位就是(0xE0)。 或者(|)可以获得最高值。 同理,第二位右移“6”位,左移最高位和第二位的二进制值。 可以通过AND(0x3F)计算并位于(&)处,然后与(0x80)或(|)相加。 第三位不需要移位,直接取后六位即可(&(ox3F)得到&),与(0x80)求或(|)。

如何将utf-8反转回来

当然,UTF-8到UTF-8的转换也是通过移位等方式完成的,也就是提取UTF-8格式对应位置的二进制数。 在上面的例子中,“you”是三个字节,所以每个字节都必须从高位到低位进行处理。 在 UTF-8 中,“你”是,,。 从高位开始,即第一个字节,取出“0100”。 这很简单。 只需将 AND (&) 与 11111 (0x1F) 进行运算即可。 从这三个字节我们可以知道最高位一定在第12位之前。 因为每次都需要六位数字。 因此,得到的结果需要左移12位,最高位补全为0100,,。 第二位是取出“”,只需要将第二个字节与(0x3F)进行AND(&)即可。 将得到的结果左移6位,取最高字节或(|)得到的结果,补全第二位,得到的结果为0100,。 以此类推,最后一位直接与(0x3F)进行与(&)运算,再与之前的结果进行或(|)运算,得到结果0100,,。

PHP代码实现

/** * utf8字符转换成Unicode字符 * @param  [type] $utf8_str Utf-8字符 * @return [type]           Unicode字符 */function utf8_str_to_unicode($utf8_str) {    $unicode = 0;    $unicode = (ord($utf8_str[0]) & 0x1F) << 12;    $unicode |= (ord($utf8_str[1]) & 0x3F) << 6;    $unicode |= (ord($utf8_str[2]) & 0x3F);    return dechex($unicode);}/** * Unicode字符转换成utf8字符 * @param  [type] $unicode_str Unicode字符 * @return [type]              Utf-8字符 */function unicode_to_utf8($unicode_str) {    $utf8_str = '';    $code = intval(hexdec($unicode_str));    //这里注意转换出来的code一定得是整形,这样才会正确的按位操作    $ord_1 = decbin(0xe0 | ($code >> 12));    $ord_2 = decbin(0x80 | (($code >> 6) & 0x3f));    $ord_3 = decbin(0x80 | ($code & 0x3f));    $utf8_str = chr(bindec($ord_1)) . chr(bindec($ord_2)) . chr(bindec($ord_3));    return $utf8_str;}

登录后复制

测试过

$utf8_str = '我';//这是汉字“你”的Unicode编码$unicode_str = '4f6b';//输出 6211echo utf8_str_to_unicode($utf8_str) . "
";//输出汉字“你”echo unicode_str_to_utf8($unicode_str);

登录后复制

上面的转换是为了测试汉字(一般都是非ASCII的),因为如果是ASCII的话,就一次又一次的一样,没必要花那么大的力气。

另外,这两个函数实现简单,仅支持单个字符[完整的utf8字符或完整字符]相互转换。 如果你理解了,你可以随意扩展。 。 。

二维码
扫一扫在手机端查看

本文链接:https://by928.com/112.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线