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

13 php regex encoding ucs2 utf-8

我有一个Unicode文本块,像这样:

?
?
?
?
?
?
?
Run Code Online (Sandbox Code Playgroud)

现在,我想将此原始Unicode文本块转换为UTF-8(HEX)代码点的文本块(请参阅此页面上的十六进制UTF-8列:https://en.wikipedia.org/wiki/UTF-8),by PHP; 像这样:

\xe1\xbb\xa5
\xc6\xb0
\xe1\xbb\xa9
\xe1\xbb\xb2
\xe1\xbb\xb6
\xe1\xbb\xb4
\xc4\x90
Run Code Online (Sandbox Code Playgroud)

不是这样的:

0x1EE5
0x01B0
0x1EE9
0x1EF2
0x1EF6
0x1EF4
0x0110
Run Code Online (Sandbox Code Playgroud)

用PHP做任何方法吗?


我已经阅读了这个主题(PHP:将unicode codepoint转换为UTF-8).但是,它我的问题不相似.


对不起,我不太了解Unicode.

Jon*_*y 5 13

我想你正在寻找bin2hex()函数:

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

并通过前缀\x到每个字节(00-FF)进行格式化

function str_hex_format ($bin) {
  return '\x'.implode('\x', str_split(bin2hex($bin), 2));
}
Run Code Online (Sandbox Code Playgroud)

对于您的样品:

// utf8 encoded input
$arr = ["?","?","?","?","?","?","?"];

foreach($arr AS $v)
  echo $v . " => " . str_hex_format($v) . "\n";
Run Code Online (Sandbox Code Playgroud)

请参阅eval.in上的测试(链接到期)

? => \xe1\xbb\xa5
? => \xc6\xb0
? => \xe1\xbb\xa9
? => \xe1\xbb\xb2
? => \xe1\xbb\xb6
? => \xe1\xbb\xb4
? => \xc4\x90
Run Code Online (Sandbox Code Playgroud)

解码示例: $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));
Run Code Online (Sandbox Code Playgroud)

???????


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


sch*_*ver 1

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

\n\n

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

\n\n
<?php\n// Hex equivalent of "\xe1\xbb\xa5\xc6\xb0\xe1\xbb\xa9\xe1\xbb\xb2\xe1\xbb\xb6\xe1\xbb\xb4\xc4\x90" in Unicode\n$unistr = "\\x1E\\xE5\\x01\\xB0\\x1E\\xE9\\x1E\\xF2\\x1E\\xF6\\x1E\\xF4\\x01\\x10";\necho " length=" . mb_strlen($unistr, \'UCS-2BE\') . "\\n";\n\n// Here\'s the key statement, convert from Unicode 16-bit to UTF-8\n$utf8str = mb_convert_encoding($unistr, "UTF-8", \'UCS-2BE\');\necho $utf8str . "\\n";\n\nfor($i=0; $i < mb_strlen($utf8str, \'UTF-8\'); $i++) {\n    $c = mb_substr($utf8str, $i, 1, \'UTF-8\');\n    $hex = bin2hex($c);\n    echo $c . "\\t" . $hex . "\\t" . preg_replace("/([0-9a-f]{2})/", \'\\\\\\\\x\\\\1\', $hex) . "\\n";\n}\n\n?>\n
Run Code Online (Sandbox Code Playgroud)\n\n

生产

\n\n
length=7\n\xe1\xbb\xa5\xc6\xb0\xe1\xbb\xa9\xe1\xbb\xb2\xe1\xbb\xb6\xe1\xbb\xb4\xc4\x90\n\xe1\xbb\xa5   e1bba5  \\xe1\\xbb\\xa5\n\xc6\xb0   c6b0    \\xc6\\xb0\n\xe1\xbb\xa9   e1bba9  \\xe1\\xbb\\xa9\n\xe1\xbb\xb2   e1bbb2  \\xe1\\xbb\\xb2\n\xe1\xbb\xb6   e1bbb6  \\xe1\\xbb\\xb6\n\xe1\xbb\xb4   e1bbb4  \\xe1\\xbb\\xb4\n\xc4\x90   c490    \\xc4\\x90\n
Run Code Online (Sandbox Code Playgroud)\n