Прежде всего, это абсолютно не UTF-8, а просто кодировка (т.е. способ хранить строки в памяти / отображать их) .
То, что у вас здесь есть, выглядит как дамп байтов, которые используются для построения каждого символа.
Если это так, вы можете получить эти байты следующим образом:
$str = utf8_encode("Demo Message!!!");
for ($i=0 ; $i<strlen($str) ; $i++) {
$byte = $str[$i];
$char = ord($byte);
printf('%02x ', $char);
}
И вы получите следующий вывод:
44 65 6d 6f 20 4d 65 73 73 61 67 65 21 21 21
Но, опять же, это не UTF-8: в UTF-8, как вы можете видеть в приведенном мной примере, D
хранится только в одном байте: 0x44
В том, что вы опубликовали, оно хранится с использованием двух байтов: 0x00 0x44
.
Может быть, вы используете какой-то UTF-16?
РЕДАКТИРОВАТЬ после небольшого тестирования и комментария @ aSeptik: это действительно UTF-16.
Чтобы получить тот тип дампа, который вы получаете, вы должны убедиться, что ваша строка закодирована в UTF-16, что можно сделать таким образом, используя, например, mb_convert_encoding
функция:
$str = mb_convert_encoding("Demo Message!!!", 'UTF-16', 'UTF-8');
Тогда нужно просто перебрать байты, из которых состоит эта строка, и сбросить их значения, как я делал раньше:
for ($i=0 ; $i<strlen($str) ; $i++) {
$byte = $str[$i];
$char = ord($byte);
printf('%02x ', $char);
}
И вы получите следующий вывод:
00 44 00 65 00 6d 00 6f 00 20 00 4d 00 65 00 73 00 73 00 61 00 67 00 65 00 21 00 21 00 21
Какой вид выглядит, как вы написали: -)
(вам просто нужно убрать пробел в вызове на printf
- я позволил ему сделать это для более удобного чтения вывода =)