2015-05-09 57 views
2

我如何轉換如何將字節(UTF-8)轉換爲PHP中的Unicode?

\xF0\x9F\x98\x83 

\u1F603 

在PHP? PS:這是表情符號 - >,我需要Unicode來使用Twemoji。

+1

UTF-8 *是* Unicode的,你的問題就沒有意義了。此外,您提到的那些值,它們是以不同方式表示相同內容的轉義序列。 –

+0

@UlrichEckhardt對不起,我英語不好。請查看此鏈接:[WordPress smilies_init()](https://developer.wordpress.org/reference/functions/smilies_init/)。我想把'$ wpsmiliestrans'的值放到http://twemoji.maxcdn.com/36x36/2764.png – Cople

回答

2

有趣的是,沒有太多的PHP在那裏。似乎有a promising post,但不幸的是接受的答案在你的情況下給出了不正確的結果。

因此,這裏是用PHP重寫的Adam's solution的修訂版本。

/** 
* Translates a sequence of UTF-8 bytes to their equivalent unicode code points. 
* Each code point is prefixed with "\u". 
* 
* @param string $utf8 
* 
* @return string 
*/ 
function utf8_to_unicode($utf8) { 
    $i = 0; 
    $l = strlen($utf8); 

    $out = ''; 

    while ($i < $l) { 
     if ((ord($utf8[$i]) & 0x80) === 0x00) { 
      // 0xxxxxxx 
      $n = ord($utf8[$i++]); 
     } elseif ((ord($utf8[$i]) & 0xE0) === 0xC0) { 
      // 110xxxxx 10xxxxxx 
      $n = 
       ((ord($utf8[$i++]) & 0x1F) << 6) | 
       ((ord($utf8[$i++]) & 0x3F) << 0) 
      ; 
     } elseif ((ord($utf8[$i]) & 0xF0) === 0xE0) { 
      // 1110xxxx 10xxxxxx 10xxxxxx 
      $n = 
       ((ord($utf8[$i++]) & 0x0F) << 12) | 
       ((ord($utf8[$i++]) & 0x3F) << 6) | 
       ((ord($utf8[$i++]) & 0x3F) << 0) 
      ; 
     } elseif ((ord($utf8[$i]) & 0xF8) === 0xF0) { 
      // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 
      $n = 
       ((ord($utf8[$i++]) & 0x07) << 18) | 
       ((ord($utf8[$i++]) & 0x3F) << 12) | 
       ((ord($utf8[$i++]) & 0x3F) << 6) | 
       ((ord($utf8[$i++]) & 0x3F) << 0) 
      ; 
     } elseif ((ord($utf8[$i]) & 0xFC) === 0xF8) { 
      // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
      $n = 
       ((ord($utf8[$i++]) & 0x03) << 24) | 
       ((ord($utf8[$i++]) & 0x3F) << 18) | 
       ((ord($utf8[$i++]) & 0x3F) << 12) | 
       ((ord($utf8[$i++]) & 0x3F) << 6) | 
       ((ord($utf8[$i++]) & 0x3F) << 0) 
      ; 
     } elseif ((ord($utf8[$i]) & 0xFE) === 0xFC) { 
      // 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
      $n = 
       ((ord($utf8[$i++]) & 0x01) << 30) | 
       ((ord($utf8[$i++]) & 0x3F) << 24) | 
       ((ord($utf8[$i++]) & 0x3F) << 18) | 
       ((ord($utf8[$i++]) & 0x3F) << 12) | 
       ((ord($utf8[$i++]) & 0x3F) << 6) | 
       ((ord($utf8[$i++]) & 0x3F) << 0) 
      ; 
     } else { 
      throw new \Exception('Invalid utf-8 code point'); 
     } 

     $n = strtoupper(dechex($n)); 
     $pad = strlen($n) <= 4 ? strlen($n) + strlen($n) %2 : 0; 
     $n = str_pad($n, $pad, "0", STR_PAD_LEFT); 

     $out .= sprintf("\u%s", $n); 
    } 

    return $out; 
} 

對你來說

php > var_dump(utf8_to_unicode("\xF0\x9F\x98\x83")); 
string(7) "\u1F603" 
+3

請將它稱爲'utf8_to_utf16'。兩者都是「Unicode」,它們都是Unicode代碼點的代表。 – DarkDust

+0

@DarkDust爲什麼選擇「utf16」?它不生成UTF-16代碼單元。它可以說不會生成UTF-32,因爲它不執行驗證。 –

+0

我建議一些其他的名字(這些都不是很好)。例如,它不驗證連續字節,並且接受最多六個字節的單個代碼點,兩者都違反了UTF-8。此外,輸出肯定不是UTF-16,因爲這需要至少兩個16位的字符來表示字符。我會說使用「iconv」,而不是一個更好的選擇。 –

0

使用的組合:

  1. stripcslashes()轉換\xFF字節逃逸。
    這將導致一串UTF-8,因爲這就是它最初的樣子。

  2. json_encode()將「」轉換回\uFFFF Unicode轉義。
    如果這就是你想要結束。 (在你的問題中沒有足夠的上下文來說明)。

+0

3Q。但它不會通過'json_encode(stripcslashes(「\ xF0 \ x9F \ x98 \ x83」))'將「\ xF0 \ x9F \ x98 \ x83」轉換爲「\ u1F603」,結果爲「\ ud83d \ ude03」;在這個頁面[WordPress smilies_init()](https://developer.wordpress.org/reference/functions/smilies_init/)中,你可以找到一個數組 - >'$ wpsmiliestrans';我需要將值轉換爲unicode,因此我可以創建像「twemoji.maxcdn.com/36x36/2764.png」的圖像鏈接,「2764」是unicode的一部分。對不起,我的英語不好。 – Cople

相關問題