溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

php怎么實(shí)現(xiàn)unicode和utf8的轉(zhuǎn)換

發(fā)布時(shí)間:2020-07-11 09:16:48 來源:億速云 閱讀:191 作者:Leah 欄目:編程語言

php怎么實(shí)現(xiàn)unicode和utf8的轉(zhuǎn)換?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

用php實(shí)現(xiàn)unicode和utf8轉(zhuǎn)換的方法:首先對(duì)于【4-6】字節(jié)編碼的情況不必考慮;然后出現(xiàn)四字節(jié)以上的【utf-8】字符,可以直接視為亂碼忽略掉或轉(zhuǎn)為unicode實(shí)體形式即可,代碼為【$utf8char = "&#{$c};"】。

php怎么實(shí)現(xiàn)unicode和utf8的轉(zhuǎn)換

用php實(shí)現(xiàn)unicode和utf8轉(zhuǎn)換的方法:

unicode編碼是實(shí)現(xiàn)utf-8與gb系列編碼(gb2312、gbk、gb18030)轉(zhuǎn)換的基礎(chǔ),雖然我們也可以直接做一個(gè)utf-8到這些編碼的對(duì)照表,但很少有人會(huì)這么做,因?yàn)閡tf-8的可變編碼具有不確定性,因此一般情況使用都是unicode與gb編碼的對(duì)照表,unicode(UCS-2)實(shí)際上是utf-8的基礎(chǔ)編碼,utf-8只是它的一種實(shí)現(xiàn)而已,兩者存在下面的對(duì)應(yīng)關(guān)系:

  • Unicode符號(hào)范圍           | UTF-8編碼方式

  • u0000 0000 - u0000 007F   | 0xxxxxxx

  • u0000 0080 - u0000 07FF   | 110xxxxx 10xxxxxx

  • u0000 0800 - u0000 FFFF   | 1110xxxx 10xxxxxx 10xxxxxx

由于目前utf-8使用的字符都是居于UCS-2的,因此對(duì)于4-6字節(jié)編碼的情況是不必考慮的,同樣地,在反向轉(zhuǎn)換的時(shí)候,如果出現(xiàn)四字節(jié)以上的utf-8字符,可以直接視為亂碼忽略掉或轉(zhuǎn)為unicode實(shí)體形式("&#long int;"形式),然后交給瀏覽器或相關(guān)解析程序去處理,用php把unicode轉(zhuǎn)為utf-8編碼的算法如下:

/*
 * 參數(shù) $c 是unicode字符編碼的int類型數(shù)值,如果是用二進(jìn)制讀取的數(shù)據(jù),在php中通常要用 hexdec(bin2hex( $bin_unichar )) 這樣轉(zhuǎn)換
 */
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);
  }
  //因?yàn)閁CS-2只有兩字節(jié),所以后面的情況是不可能出現(xiàn)的,這里只是說明unicode HTML實(shí)體編碼的用法。
  else
  {
        $utf8char = "&#{$c};";
  }
  return $utf8char;
}

在目前的環(huán)境范圍內(nèi),可以認(rèn)為 utf-8字符集==unicode(UCS-2),但從理論上,主要字符集關(guān)系的包含關(guān)系如下:

utf-8 > unicode(UCS-2) > gb18030 > gbk > gb2312

因此,如果編碼都正確的情況下:

gb2312 => gbk => gb18030 => unicode(UCS-2) => utf-8

這樣的一個(gè)轉(zhuǎn)變過程,基本上是無損的,但反而言之,由

utf-8 => unicode(UCS-2) => gb18030=> gbk => gb2312

這樣的轉(zhuǎn)變過程,是很可能存在不能識(shí)別的字符的,因此,如果對(duì)于使用utf-8編碼的系統(tǒng),盡量不要輕易的去做反向轉(zhuǎn)換編碼的操作。


關(guān)于php怎么實(shí)現(xiàn)unicode和utf8的轉(zhuǎn)換問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI