У меня есть текстовый блок 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: преобразовать кодировку Unicode в UTF-8). Но это не похож на мой вопрос.
Извините, я не знаю много о Unicode
,
Я думаю, что вы ищете функция 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));
ụưứỲỶỴĐ
Для получения дополнительной информации о escape-последовательность \x
в двойных кавычках см руководство по PHP.
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
Это разбивает строку на символы UTF8, используя preg_split
и u
флаг. поскольку preg_split
возвращает пустую строку перед первым символом и пустую строку после последнего символа, нам нужно array_slice
первый и последний символы. Это можно легко изменить, например, для возврата массива.
Редактировать:
Более «правильный» способ сделать это так:
echo trim(json_encode(utf8_encode('ụưứỲỶỴĐ')),'"');
Главное, что вам нужно сделать — это сказать PHP правильно интерпретировать входящие символы Юникода. Как только вы это сделаете, вы можете преобразовать их в 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