如何将 php 中的字节 (UTF-8) 转换为 Unicode?
How to convert Bytes(UTF-8) to Unicode in php?
如何转换
\xF0\x9F\x98\x83
至
\u1F603
在 php?
PS:这是一个表情符号 -> ,我需要 Unicode 才能使用 Twemoji。
使用以下组合:
stripcslashes()
转换 \xFF
字节转义。
这将导致一串 UTF-8,因为它最初看起来就是这样。
json_encode()
将 "" 转换回 \uFFFF
Unicode 转义。
如果这就是你想要的结果。 (你的问题中没有足够的上下文来说明。)
有趣的是,PHP 的内容不多。似乎有 a promising post,但不幸的是,接受的答案在您的情况下给出了错误的结果。
所以这里是 Adam's solution 的修订版,在 PHP 中重写。
/**
* 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"
如何转换
\xF0\x9F\x98\x83
至
\u1F603
在 php?
PS:这是一个表情符号 -> ,我需要 Unicode 才能使用 Twemoji。
使用以下组合:
stripcslashes()
转换\xFF
字节转义。
这将导致一串 UTF-8,因为它最初看起来就是这样。json_encode()
将 "" 转换回\uFFFF
Unicode 转义。
如果这就是你想要的结果。 (你的问题中没有足够的上下文来说明。)
有趣的是,PHP 的内容不多。似乎有 a promising post,但不幸的是,接受的答案在您的情况下给出了错误的结果。
所以这里是 Adam's solution 的修订版,在 PHP 中重写。
/**
* 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"