Проблема с PHP-кодированием utf - PullRequest
1 голос
/ 01 мая 2010

Как я могу кодировать строки в формате UTF-16BE в PHP? Для "Demo Message !!!" закодированная строка должна быть '00440065006D006F0020004D00650073007300610067006'. Также мне нужно закодировать арабские символы в этот формат.

Ответы [ 2 ]

5 голосов
/ 01 мая 2010

Прежде всего, это абсолютно не 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 - я позволил ему сделать это для более удобного чтения вывода =)

0 голосов
/ 01 мая 2010

например. с помощью расширения mbstring и его функции mb_convert_encoding () .

$in = 'Demo Message!!!';
$out = mb_convert_encoding($in, 'UTF-16BE');

for($i=0; $i<strlen($out); $i++) {
  printf("%02X ", ord($out[$i]));
}

печать

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 

Или с помощью iconv ()

$in = 'Demo Message!!!';
$out = iconv('iso-8859-1', 'UTF-16BE', $in);

for($i=0; $i<strlen($out); $i++) {
  printf("%02X ", ord($out[$i]));
}
...