Символ Юникода в октетах в шестнадцатеричный - PullRequest
1 голос
/ 04 октября 2010

Символ Unicode в октетах - это что-то вроде 110xxxxx 10xxxxxx.Как я могу преобразовать эти октеты в шестнадцатеричном формате, например, U + XXXX?

Ответы [ 2 ]

3 голосов
/ 05 октября 2010

Вы можете использовать декодер UTF-8 iconv, чтобы избежать необходимости писать его самостоятельно:

function utf8_to_codepoints($s) {
    return unpack('V*', iconv('UTF-8', 'UCS-4LE', $s));
}

$data= "Caf\xc3\xa9 \xe6\x97\xa5\xe6\x9c\xac \xf0\x9d\x84\x9e"; // Café 日本 ?
var_export(utf8_to_codepoints($data));

дает:

array (
  1 => 67,
  2 => 97,
  3 => 102,
  4 => 233,
  5 => 32,
  6 => 26085,
  7 => 26412,
  8 => 32,
  9 => 119070,
)

, который можно преобразовать в формат U + nnnn с помощью dechex.

1 голос
/ 05 октября 2010

Прежде всего, вот документ , который определенно определяет кодировку UTF-8 .

Два октета в вашем примере: 110xxxxx 10xxxxxx кодируют один символ Unicode. Его двоичный код - ну, просто возьмите эти x (биты) и сложите их вместе. Вы получите число - в двоичном формате, но вы можете преобразовать его в десятичное или шестнадцатеричное, если хотите. Это то же число, что и XXXX в U + XXXX.

Как я узнал, что 110xxxxx 10xxxxxx кодирует один символ? В потоке UTF-8 может быть три вида октетов:

  • 10xxxxxx - конечные октеты
  • 0xxxxxxx - символы ASCII
  • 110xxxxx, 1110xxxx и т. Д. - ведущие октеты в последовательности.

Последовательности начальных и конечных октетов используются для кодирования точек Unicode от 128 и выше. 110xxxxx означает, что он запускает последовательность из двух октетов, 1110xxxx запускает последовательность из трех октетов и т. Д. Таким образом, вы можете изолировать последовательности друг от друга. Затем возьмите x из всех октетов в последовательности, и это ваш код Unicode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...