我有一个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
了解不多。
答案 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_split
和u
标志将字符串拆分为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