我问一个问题之前摆脱UTF-8 UCS-2 / HexEncoded字符串,我得到了一些人通过以下链接一些帮助。

UCS2 / HexEncoded字符

但现在我需要从PHP中的UCS-2 / HexEncoded串得到正确的UTF-8。

有关以下字符串:

00480065006C006C006F将返回 '你好'

06450631062d0628064b06270020063906270644064500200021将在阿拉伯返回(!مرحباعالم)

有帮助吗?

解决方案

可以通过用的 hexdec()下,重新包装组件字符,然后使用的 mb_convert_encoding()以从UCS-转换转换十六进制字符重构一个十六进制的表示2成UTF-8。正如我在答复中提到你的其他问题,你仍然需要小心的输出编码,这里虽然你已经明确要求UTF-8,因此我们将它用在即将到来的样品。

下面是确实在本地字符串形式转换UCS-2在己烷中为UTF-8的工作的样品。由于PHP目前不具有的 HEX2BIN()的功能,这将使事情很容易出货,我们将使用一个张贴在末尾的参考链接。我已经将它重命名为 local_hex2bin()的以防万一它与PHP的未来版本或者其他一些第三方代码的定义,你在你的项目包括冲突。

<?php
function local_hex2bin($h)
{
if (!is_string($h)) return null;
$r='';
for ($a=0; $a<strlen($h); $a+=2) { $r.=chr(hexdec($h{$a}.$h{($a+1)})); }
return $r;
};

header('Content-Type: text/html; charset=UTF-8');
mb_http_output('UTF-8');
echo '<html><head>';
echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';
echo '</head><body>';
echo 'output encoding: '.mb_http_output().'<br />';
$querystring = $_SERVER['QUERY_STRING'];
// NOTE: we could substitute one of the following:
// $querystring = '06450631062d0628064b06270020063906270644064500200021';
// $querystring = '00480065006C006C006F';
$ucs2string = local_hex2bin($querystring);
// NOTE: The source encoding could also be UTF-16 here.
// TODO: Should check byte-order-mark, if available, in case
//       16-bit-aligned bytes are reversed.
$utf8string = mb_convert_encoding($ucs2string, 'UTF-8', 'UCS-2');
echo 'query string: '.$querystring.'<br />';
echo 'converted string: '.$utf8string.'<br />';
echo '</body>';
?>

局部地,我称这种样品页UCS2HexToUTF8.php,然后使用查询字符串来设定输出。

UCS2HexToUTF8.php?06450631062d0628064b06270020063906270644064500200021
--
encoding: UTF-8
query string: 06450631062d0628064b06270020063906270644064500200021
converted string: مرحبًا عالم !

UCS2HexToUTF8.php?00480065006C006C006F
--
output encoding: UTF-8
query string: 00480065006C006C006F
converted string: Hello

这里的链接到 HEX2BIN()函数的原始来源。结果 PHP:BIN2HEX(),评论#86123 @ php.net

此外,如在我的评论中所指出的调用之前的 mb_convert_encoding()后,你可能会想尝试检测其中尾数排序是使用由源,特别是如果你的应用程序有部分其中,一个服务器上的一个或多个CPU通过取向从静止不同。

下面是一个链接,可以帮助您识别的字节顺序标记(BOM)。结果 字节顺序标记@维基百科

其他提示

UCS-2的更精确的转换为UTF-8

function ucs2_to_utf8($h)
{
    if (!is_string($h)) return null;
    $r='';
    for ($a=0; $a<strlen($h); $a+=4) { $r.=chr(hexdec($h{$a}.$h{($a+1)}.$h{($a+2)}.$h{($a+3)})); }
    return $r;
}

在选择的回答的问题是它是由2代替4分频,这将导致转换00为空,并且将导致此当其上的HTML使用属性,如标题=“”或ALT =“” <值出现/ p>

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top