пример строки октета в формате utf-8 - PullRequest
2 голосов
/ 22 марта 2010

Я работаю с функцией, которая ожидает строку, отформатированную в виде строки октета в кодировке utf-8. Может кто-нибудь привести пример того, как будет выглядеть строка октета в кодировке utf-8?

Другими словами, если я преобразую 'foo' в байты, я получу 112, 111, 111. Как эти кодовые символы будут выглядеть как строка октетов в кодировке utf-8? Будет ли это "0x70 0x6f 0x6f"?

Контекст моего вопроса - это процесс генерации подписи openid, как описано в спецификации openid : «Сообщение ДОЛЖНО быть закодировано в UTF-8 для создания байтовой строки». Я ищу пример того, как это будет выглядеть.

Спасибо

Ответы [ 3 ]

2 голосов
/ 22 марта 2010

Я думаю, что вы, возможно, допустили некоторые ошибки при кодировании вашего примера, но в любом случае, я предполагаю, что ответ, который вам действительно нужен, это UTF-8 - это расширенный набор ASCII (стандартный способ кодирования символов в байты ).

Итак, если вы передаете строку в кодировке ASCII в функцию, которая ожидает строку в кодировке UTF-8, она должна работать просто отлично.

Однако, наоборот совсем не так. UTF-8 может представлять много символов, которые ASCII не может, поэтому передача строки в кодировке UTF-8 функции, которая ожидает строку ASCII (то есть «нормальную»), опасна (если только вы не уверены, что все символы являются частью Подмножество ASCII).

2 голосов
/ 22 марта 2010

Нет. Символы UTF-8 могут занимать несколько байтов. Если вы хотите узнать о UTF-8, вам следует начать с его статьи в Википедии , в которой есть хорошее описание.

1 голос
/ 26 марта 2010

Строка "foo" кодируется как 66 6F 6F, но это похоже на почти все производные ASCII. Это одна из главных особенностей UTF-8: обратная совместимость с 7-битным ASCII. Если вы имеете дело только с ASCII, вам не нужно делать ничего особенного.

Другие символы кодируются до 4 байтов. В частности, биты кодовой точки Unicode разбиты на один из шаблонов:

  • 0xxxxxxx
  • 110xxxxx 10xxxxxx
  • 1110xxxx 10xxxxxx 10xxxxxx
  • 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

с требованием использования кратчайшей подходящей последовательности. Так, например, знак евро ('€' = U + 20AC = двоичный 10 000010 101100) кодируется как 1110 0010, 10 000010, 10 101100 = E2 82 AC.

Итак, просто пройтись по кодовым точкам Unicode в строке и кодировать каждую из них в UTF-8.

Сложнее всего понять, в какой кодировке находится ваша строка. Большинство современных языков (например, Java, C #, Python 3.x) имеют разные типы для «байтового массива» и «строки», где «строки» всегда имеют одинаковую внутреннюю кодировку (UTF-16 или UTF-32), и вы необходимо вызвать функцию «кодирования», если вы хотите преобразовать ее в массив байтов в определенной кодировке.

К сожалению, более старые языки, такие как C, объединяют "символы" и "байты". (IIRC, PHP тоже такой, но прошло несколько лет с тех пор, как я его использовал.) И даже если ваш язык поддерживает Unicode, вам все равно придется иметь дело с дисковыми файлами и веб-страницами с неопределенными кодировками. Для более подробной информации, ищите "chardet".

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