如何将Unicode文本块转换为UTF-8(HEX)代码点?

时间:2015-07-19 13:27:01

标签: php regex encoding utf-8 ucs2

我有一个Unicode文本块,如下所示:

ụ
ư
ứ
Ỳ
Ỷ
Ỵ
Đ

现在,我想将此原始Unicode文本块转换为UTF-8(HEX)代码点的文本块(请参阅此页面上的十六进制UTF-8 列:{ {3}}),PHP;像这样:

\xe1\xbb\xa5
\xc6\xb0
\xe1\xbb\xa9
\xe1\xbb\xb2
\xe1\xbb\xb6
\xe1\xbb\xb4
\xc4\x90

喜欢这样:

0x1EE5
0x01B0
0x1EE9
0x1EF2
0x1EF6
0x1EF4
0x0110

有什么方法可以通过PHP实现吗?

我已阅读此主题(https://en.wikipedia.org/wiki/UTF-8)。但是,与我的问题不相似

对不起,我对Unicode了解不多。

3 个答案:

答案 0 :(得分:13)

我认为你正在寻找bin2hex() function

  

将二进制数据转换为十六进制表示

通过将\x添加到每个字节( 00-FF

进行格式化
function str_hex_format ($bin) {
  return '\x'.implode('\x', str_split(bin2hex($bin), 2));
}

您的样本:

// utf8 encoded input
$arr = ["ụ","ư","ứ","Ỳ","Ỷ","Ỵ","Đ"];

foreach($arr AS $v)
  echo $v . " => " . str_hex_format($v) . "\n";

See test at eval.in link expires

ụ => \xe1\xbb\xa5
ư => \xc6\xb0
ứ => \xe1\xbb\xa9
Ỳ => \xe1\xbb\xb2
Ỷ => \xe1\xbb\xb6
Ỵ => \xe1\xbb\xb4
Đ => \xc4\x90

解码示例:$str = str_hex_format("ụưứỲỶỴĐ"); echo $str;

  

\ XE1 \ XBB \ xa5 \ XC6 \ XB0 \ XE1 \ XBB版权所有\ xA9 \ XE1 \ XBB \ XB2 \ XE1 \ XBB \ XB6 \ XE1 \ XBB \ XB4 \ XC4 \ X90

echo hex2bin(str_replace('\x', "", $str));
  

ụưứỲỶỴĐ

有关双引号字符串see php manual转义序列 \x的详细信息。

答案 1 :(得分:3)

PHP将字符串视为字符数组,无论编码如何。如果您不需要分隔UTF8字符,那么这样的工作就可以了:

$str='ụưứỲỶỴĐ';
foreach(str_split($str) as $char)
  echo '\x'.str_pad(dechex(ord($char)),'0',2,STR_PAD_LEFT);

输出:

\xe1\xbb\xa5\xc6\xb0\xe1\xbb\xa9\xe1\xbb\xb2\xe1\xbb\xb6\xe1\xbb\xb4\xc4\x90

如果您需要分隔UTF8字符(即使用换行符),那么您需要这样的内容:

$str='ụưứỲỶỴĐ';
foreach(array_slice(preg_split('~~u',$str),1,-1) as $UTF8char){ // split before/after every UTF8 character and remove first/last empty string
  foreach(str_split($UTF8char) as $char)
    echo '\x'.str_pad(dechex(ord($char)),'0',2,STR_PAD_LEFT);
  echo "\n"; // delimiter
}

输出:

\xe1\xbb\xa5
\xc6\xb0
\xe1\xbb\xa9
\xe1\xbb\xb2
\xe1\xbb\xb6
\xe1\xbb\xb4
\xc4\x90

这会使用preg_splitu标志将字符串拆分为UTF8字符。由于preg_split返回第一个字符前的空字符串和最后一个字符后面的空字符串,因此我们需要array_slice第一个和最后一个字符。例如,可以很容易地修改它以返回数组。

修改 更多"正确"这样做的方法是:

echo trim(json_encode(utf8_encode('ụưứỲỶỴĐ')),'"');

答案 2 :(得分:1)

您需要做的主要事情是告诉PHP正确解释传入的Unicode字符。完成后,您可以根据需要将它们转换为UTF-8然后再转换为十六进制。

此代码片段采用Unicode中的示例字符,将它们转换为UTF-8,然后转储这些字符的十六进制表示。

<?php
// Hex equivalent of "ụưứỲỶỴĐ" in Unicode
$unistr = "\x1E\xE5\x01\xB0\x1E\xE9\x1E\xF2\x1E\xF6\x1E\xF4\x01\x10";
echo " length=" . mb_strlen($unistr, 'UCS-2BE') . "\n";

// Here's the key statement, convert from Unicode 16-bit to UTF-8
$utf8str = mb_convert_encoding($unistr, "UTF-8", 'UCS-2BE');
echo $utf8str . "\n";

for($i=0; $i < mb_strlen($utf8str, 'UTF-8'); $i++) {
    $c = mb_substr($utf8str, $i, 1, 'UTF-8');
    $hex = bin2hex($c);
    echo $c . "\t" . $hex . "\t" . preg_replace("/([0-9a-f]{2})/", '\\\\x\\1', $hex) . "\n";
}

?>

可生产

length=7
ụưứỲỶỴĐ
ụ   e1bba5  \xe1\xbb\xa5
ư   c6b0    \xc6\xb0
ứ   e1bba9  \xe1\xbb\xa9
Ỳ   e1bbb2  \xe1\xbb\xb2
Ỷ   e1bbb6  \xe1\xbb\xb6
Ỵ   e1bbb4  \xe1\xbb\xb4
Đ   c490    \xc4\x90