PHP 编码转换


世界上通用的编码方式为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;

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM