php 16进制转换utf-8,php对unicode转utf-8编码
如果只是unicode轉utf-8編碼的算法,網上到處都是了,不過很多人也是你抄我,我抄你,根本就不理解why和do,本文除了給出最簡單的php對unicode轉utf-8編碼函數之外,也深入討論了這兩種編碼的關系,理解好了會發現網上一些舊的東西,是嚴重多余兼過期的,因為從utf-8流行開始到現在,早已經由原來六字節可變編碼到實際完全居于unicode(UCS-2)的穩定階段。
unicode編碼是實現utf-8與gb系列編碼(gb2312、gbk、gb18030)轉換的基礎,雖然我們也可以直接做一個utf-8到這些編碼的對照表,但很少有人會這么做,因為utf-8的可變編碼具有不確定性,因此一般情況使用都是unicode與gb編碼的對照表,unicode(UCS-2)實際上是utf-8的基礎編碼,utf-8只是它的一種實現而已,兩者存在下面的對應關系:
Unicode符號范圍?????????? | UTF-8編碼方式
u0000 0000 - u0000 007F?? | 0xxxxxxx
u0000 0080 - u0000 07FF?? | 110xxxxx 10xxxxxx
u0000 0800 - u0000 FFFF?? | 1110xxxx 10xxxxxx 10xxxxxx
由于目前utf-8使用的字符都是居于UCS-2的,因此對于4-6字節編碼的情況是不必考慮的,同樣地,在反向轉換的時候,如果出現四字節以上的utf-8字符,可以直接視為亂碼忽略掉或轉為unicode實體形式("long int;"形式),然后交給瀏覽器或相關解析程序去處理,用php把unicode轉為utf-8編碼的算法如下:
/*
* 參數 $c 是unicode字符編碼的int類型數值,如果是用二進制讀取的數據,在php中通常要用 hexdec(bin2hex( $bin_unichar )) 這樣轉換
*/
function uni2utf8( $c )
{
if ($c < 0x80)
{
$utf8char = chr($c);
}
else if ($c < 0x800)
{
$utf8char = chr(0xC0 | $c >> 0x06).chr(0x80 | $c & 0x3F);
}
else if ($c < 0x10000)
{
$utf8char = chr(0xE0 | $c >> 0x0C).chr(0x80 | $c >> 0x06 & 0x3F).chr(0x80 | $c & 0x3F);
}
//因為UCS-2只有兩字節,所以后面的情況是不可能出現的,這里只是說明unicode HTML實體編碼的用法。
else
{
$utf8char = "{$c};";
}
return $utf8char;
}
在目前的環境范圍內,可以認為 utf-8字符集==unicode(UCS-2),但從理論上,主要字符集之關的包含關系如下:
utf-8 > unicode(UCS-2) > gb18030 > gbk > gb2312
因此,如果編碼都正確的情況下
gb2312 => gbk => gb18030 => unicode(UCS-2) => utf-8
這樣的一個轉變過程,基本上是無損的,但反而言之,由
utf-8 => unicode(UCS-2) => gb18030=> gbk => gb2312
這樣的轉變過程,是很可能存在不能識別的字符的,因此,如果對于使用utf-8編碼的系統,盡量不要輕易的去做反向轉換編碼的操作。
總結
以上是生活随笔為你收集整理的php 16进制转换utf-8,php对unicode转utf-8编码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java编译和执行模式包括两种,Java
- 下一篇: php软件升级管理系统,POSCMS开源