之前我问过一个问题,要求从UTF-8获取UCS-2 / HexEncoded字符串,我在以下链接中得到了一些人的帮助。
但现在我需要从PHP中的UCS-2 / HexEncoded字符串中获取正确的UTF-8。
对于以下字符串:
00480065006C006C006F将返回'Hello'
06450631062d0628064b06270020063906270644064500200021将在阿拉伯语中返回(!مرحباعالم)
答案 0 :(得分:3)
您可以通过使用 hexdec()转换十六进制字符重新组合十六进制表示,重新打包组件字符,然后使用 mb_convert_encoding()转换为UCS- 2成UTF-8。正如我在回答你的另一个问题时提到的那样,你仍然需要注意输出编码,虽然你已经特别要求UTF-8,所以我们将把它用于即将到来的样本。
这是一个样本,用于将Hex中的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(), comment #86123 @ php.net
另外,正如我在调用 mb_convert_encoding()之前的评论中所述,您可能想要尝试检测源正在使用哪个字节序,特别是如果您的应用程序有部分其中一台服务器上的一个或多个CPU与其他CPU的方向不同。
这是一个可以帮助您识别字节顺序标记(BOM)的链接 Byte order mark @ Wikipedia
答案 1 :(得分:0)
更准确地将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转换为null并导致此�当它用于诸如title =“”或alt =“” < / p>