世界上通用的编码方式为unicode (万国码)
通过这种方式我们得到了一个统一的并且包含各种字符的编码表,但是这种编码方式有个极大的缺点:unicode的每个字符固定格式,如果我们存储一个单字符的它会极大的浪费空间
于是人们发明了各种编码规则utf-8,gbk...等
但这么多的编码规则,就会出现这样的情况:假如A使用utf-8编码了一个文件,当B使用gbk去解释这个文件时则会出现乱码 (因此我们要统一好字符格式)
因此我们可以将utf-8 转化为unicode再将unicode转化为gbk
utf-8的编码规则
1) 对于单字节的符号, 字节的第一位设为0, 后面7位为这个符号的unicode码. 因此对于
英语字母, UTF-8编码和ASCII码是同样的.
2) 对于n字节的符号(n>1), 第一个字节的前n位都设为1, 第n+1位设为0, 后面字节的前
两位一律设为10. 剩下的没有提及的二进制位, 所有为这个符号的unicode码.
例如 以汉字严为例
已知"严"的unicode是4E25(1001110 00100101), 依据上表, 能够发现4E25处在第三行的
范围内(0000 0800 - 0000 FFFF), 因此"严"的UTF-8编码须要三个字节, 即格式是
"1110xxxx 10xxxxxx 10xxxxxx". 然后, 从"严"的最后一个二进制位開始, 依次从后向前
填入格式中的x, 多出的位补0. 这样就得到了, "严"的UTF-8编码是 "11100100 10111000
10100101", 转换成十六进制就是E4B8A5.
php实现utf-8转为unicode
<?php $str = '严'; $name = iconv('UTF-8', 'UCS-2BE', $str); //php的内置函数 iconv 将utf-8的编码转为ucs(unicode)系列编码 $len = strlen($str); $str = ''; for ($i = 0; $i < $len - 1; $i = $i + 2){ $c = $name[$i]; $c2 = $name[$i + 1]; //不懂为什么要取两位 //ord函数 返回字符的ascii码值 //base_convert 将一个进制数 转化为另一个进制数 //str_pad 填充0 if (ord($c) > 0){ $str .= '\u'.base_convert(ord($c), 10, 16).str_pad(base_convert(ord($c2), 10, 16), 2, 0, STR_PAD_LEFT); } else { $str .= '\u'.str_pad(base_convert(ord($c2), 10, 16), 4, 0, STR_PAD_LEFT); } } echo $str;