最近正好需要用到编码转换,于是查了一下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字符或完整字符]相互转换。 如果你理解了,你可以随意扩展。 。 。
扫一扫在手机端查看
-
Tags : PHP实现Unicode和Utf-8编码的互相转换
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。


客服1