我如何轉換如何將字節(UTF-8)轉換爲PHP中的Unicode?
\xF0\x9F\x98\x83
到
\u1F603
在PHP? PS:這是表情符號 - >,我需要Unicode來使用Twemoji。
我如何轉換如何將字節(UTF-8)轉換爲PHP中的Unicode?
\xF0\x9F\x98\x83
到
\u1F603
在PHP? PS:這是表情符號 - >,我需要Unicode來使用Twemoji。
有趣的是,沒有太多的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"
請將它稱爲'utf8_to_utf16'。兩者都是「Unicode」,它們都是Unicode代碼點的代表。 – DarkDust
@DarkDust爲什麼選擇「utf16」?它不生成UTF-16代碼單元。它可以說不會生成UTF-32,因爲它不執行驗證。 –
我建議一些其他的名字(這些都不是很好)。例如,它不驗證連續字節,並且接受最多六個字節的單個代碼點,兩者都違反了UTF-8。此外,輸出肯定不是UTF-16,因爲這需要至少兩個16位的字符來表示字符。我會說使用「iconv」,而不是一個更好的選擇。 –
使用的組合:
stripcslashes()
轉換\xFF
字節逃逸。
這將導致一串UTF-8,因爲這就是它最初的樣子。
json_encode()
將「」轉換回\uFFFF
Unicode轉義。
如果這就是你想要結束。 (在你的問題中沒有足夠的上下文來說明)。
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
UTF-8 *是* Unicode的,你的問題就沒有意義了。此外,您提到的那些值,它們是以不同方式表示相同內容的轉義序列。 –
@UlrichEckhardt對不起,我英語不好。請查看此鏈接:[WordPress smilies_init()](https://developer.wordpress.org/reference/functions/smilies_init/)。我想把'$ wpsmiliestrans'的值放到http://twemoji.maxcdn.com/36x36/2764.png – Cople