Ранее я задавал вопрос о получении строки UCS-2 / HexEncoded из UTF-8, и я получил некоторую помощь от некоторых парней по следующей ссылке.
Символы UCS2 / HexEncoded
Но теперь мне нужно получить правильный UTF-8 из строки UCS-2 / HexEncoded в PHP.
Для следующих строк:
00480065006C006C006F вернет 'Hello'
06450631062d0628064b06270020063906270644064500200021 вернется (! مرحبا عالم) в арабском
Вы можете перекомпоновать шестнадцатеричное представление, преобразовывая шестнадцатеричные символы с hexdec () , переупаковывая символы компонентов, а затем используя mb_convert_encoding () для преобразования из UCS-2 в UTF-8. Как я уже упоминал в своем ответе на ваш другой вопрос, вам все равно нужно быть осторожным с кодировкой вывода, хотя здесь вы специально запросили UTF-8, поэтому мы будем использовать это для предстоящего образца.
Вот пример, который выполняет работу по преобразованию UCS-2 в Hex в UTF-8 в собственную строчную форму. Поскольку PHP в настоящее время не поставляется с функцией hex2bin () , что сделало бы все очень просто, мы будем использовать тот, который был отправлен на ссылку ссылки в конце. Я переименовал его в local_hex2bin () на случай, если он конфликтует с будущей версией PHP или с определением в другом стороннем коде, который вы включаете в свой проект.
<?php function local_hex2bin($h) { if (!is_string($h)) return null; $r=''; for ($a=0; $a<strlen($h); $a+=2) { $r.=chr(hexdec($h{$a}.$h{($a+1)})); } return $r; }; header('Content-Type: text/html; charset=UTF-8'); mb_http_output('UTF-8'); echo '<html><head>'; echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'; echo '</head><body>'; echo 'output encoding: '.mb_http_output().'<br />'; $querystring = $_SERVER['QUERY_STRING']; // NOTE: we could substitute one of the following: // $querystring = '06450631062d0628064b06270020063906270644064500200021'; // $querystring = '00480065006C006C006F'; $ucs2string = local_hex2bin($querystring); // NOTE: The source encoding could also be UTF-16 here. // TODO: Should check byte-order-mark, if available, in case // 16-bit-aligned bytes are reversed. $utf8string = mb_convert_encoding($ucs2string, 'UTF-8', 'UCS-2'); echo 'query string: '.$querystring.'<br />'; echo 'converted string: '.$utf8string.'<br />'; echo '</body>'; ?>
Локально я вызывал эту примерную страницу UCS2HexToUTF8.php, а затем использовал запрос для установки вывода.
UCS2HexToUTF8.php?06450631062d0628064b06270020063906270644064500200021 -- encoding: UTF-8 query string: 06450631062d0628064b06270020063906270644064500200021 converted string: مرحبًا عالم ! UCS2HexToUTF8.php?00480065006C006C006F -- output encoding: UTF-8 query string: 00480065006C006C006F converted string: Hello
Вот ссылка на исходный источник функции hex2bin () .
PHP: bin2hex (), комментарий # 86123 @ php.net
Кроме того, как отмечалось в моих комментариях перед вызовом mb_convert_encoding () , вы, вероятно, захотите попытаться определить, какой порядок endian используется в источнике, особенно если ваше приложение имеет части, где один или несколько процессоров на одном сервере отличаются от остальные – по ориентации.
Вот ссылка, которая может помочь вам идентифицировать метки байтов (BOM).
Значок байтового байта @ Википедия