13

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

ụ
ư
ứ
Ỳ
Ỷ
Ỵ
Đ

现在,我想将此原始 Unicode 文本块转换为 UTF-8 (HEX) 代码点的文本块(请参阅此页面上的十六进制 UTF-8列:https ://en.wikipedia.org/wiki /UTF-8 ), 由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 做到这一点吗?


我已经阅读了这个主题(PHP: Convert unicode codepoint to UTF-8)。但是,它与我的问题不相似。


对不起,我不太了解Unicode

4

3 回答 3

13

我认为您正在寻找bin2hex() 函数

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

\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";

在 eval.in 上查看测试链接过期

ụ => \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));

ụưứỲỶỴĐ</p>


有关双引号字符串中的转义序列 的更多信息,请参阅 php 手册\x

于 2015-07-22T06:01:46.207 回答
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_split这使用和u标志将字符串拆分为 UTF8 字符。由于preg_split返回第一个字符之前的空字符串和最后一个字符之后的空字符串,所以我们需要array_slice第一个和最后一个字符。例如,这可以很容易地修改为返回一个数组。

编辑: 一个更“正确”的方法是这样的:

echo trim(json_encode(utf8_encode('ụưứỲỶỴĐ')),'"');
于 2015-07-25T01:31:09.193 回答
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
于 2015-07-22T05:54:55.623 回答