2015-09-10 3 views
0

Я задал Google вопрос выше и был отправлен в Difference between UTF-8 and UTF-16?, который, к сожалению, не отвечает на вопрос.Совместим ли UTF-16 с UTF-8?

Из моего понимания UTF-8 должен быть подмножеством UTF-16, означающим: если мой код использует UTF-16, и я передаю кодированную строку UTF-8, все должно всегда быть в порядке. Другой способ (ожидающий UTF-8 и получение UTF-16) может вызвать проблемы.

Верно ли это?

EDIT: Чтобы выяснить, почему связанный вопрос SO не отвечает на мой вопрос: моя проблема возникла при попытке обработать строку JSON с использованием WebClient.DownloadString, потому что WebClient использовал неправильную кодировку. JSON, полученный мной от запроса, был закодирован как UTF-8, и вопрос для меня был: если бы я установил webClient.Encoding = New System.Text.UnicodeEncoding (aka UTF-16), я был бы в безопасности, то есть мог бы обрабатывать запросы UTF-8 и UTF-16 результаты, или я должен использовать webClient.Encoding = New System.Text.UTF8Encoding?

+2

no. они несовместимы. – i486

+1

Что вы подразумеваете под «рукой»? Они кодируют один и тот же набор символов, но последовательность байтов в UTF-8 не будет представлять один и тот же набор символов, если он интерпретируется как UTF-16. Это действительно поможет, если вы расскажете больше о том, что вы пытаетесь сделать. –

+2

Возможный дубликат [Разница между UTF-8 и UTF-16?] (Http://stackoverflow.com/questions/4655250/difference-between-utf-8-and-utf-16) – tripleee

ответ

2

Непонятно, что вы подразумеваете под «совместимостью», поэтому давайте разберем некоторые основы.

Unicode является базовой концепцией и правильно реализован, UTF-16 и UTF-8 - это два разных способа кодирования Unicode. Они, очевидно, разные - иначе, почему бы было два разных понятия?

Unicode сам по себе не определяет формат сериализации. UTF-8 и UTF-16 являются двумя альтернативными форматами сериализации.

Они «совместимы» в том смысле, что они могут представлять одни и те же кодовые точки Юникода, но «несовместимы» с тем, что представления совершенно разные.

Есть еще два поворота с UTF-16. На самом деле существуют два разных кодировки: UTF-16LE и UTF-16BE. Они различаются по степени достоверности. (UTF-8 является байтовым кодированием, поэтому не имеет endianness.) Legacy UTF-16 раньше ограничивалось 65536 возможных символов, который в настоящее время меньше, чем Unicode. Это обрабатывается суррогатами, но действительно старые и/или нарушенные реализации UTF-16 (правильно идентифицированные как UCS-2, а не «реальные» UTF-16) не поддерживают их.

Для немного конкреции, давайте сравним четыре разных кодовых пункта. Мы выбираем U + 0041, U + 00E5, U + 201C и U + 1F4A9, так как они хорошо иллюстрируют различия.

U + 0041 - это 7-разрядный символ, поэтому UTF-8 представляет его просто с одним байтом. U + 00E5 является 8-битным символом, поэтому UTF-8 нуждается в его кодировании. U + 1F4A9 находится за пределами базовой многоязычной плоскости, поэтому UTF-16 представляет его с суррогатной последовательностью. Наконец, U + 201C не является ничем из вышеперечисленного.

Здесь представлены изображения наших кандидатов в UTF-8, UTF-16LE и UTF-16BE.

  • U+0041: 0x41; 0x41 0x00; 0x00 0x41
  • U+00E4: 0xC3 0xA4; 0xE4 0x00; 0x00 0xE4
  • U+201C: 0xE2 0x80 0x9C; 0x1C 0x20; 0x20 0x1C
  • U+1F4A9: 0xF0 0x9F 0x92 0xA9; 0x3D 0xD8 0xA9 0xDC; 0xD8 0x3D 0xDC 0xA9

Для того, чтобы выбрать один очевидный пример, кодировка UTF-8 U + 00E5 будет представлять собой совершенно иной характер, если интерпретировать как UTF-16 (в UTF-16LE, было бы U+A4C3, а в UTF-16BE, U+C3A4.) И наоборот, многие коды UTF-16 не являются действительными последовательностями UTF-8. Поэтому в этом смысле UTF-8 и UTF-16 полностью и совершенно несовместимы.

В современных языках программирования ваш код должен просто использовать Юникод, и пусть язык обрабатывает кодировку с нулевым названием, подходящую для вашей платформы и библиотек. По несколько касательной заметке см. Также http://utf8everywhere.org/

+0

Рассматривая вопрос, с которым вы связались, ответы там в основном говорят вам об этом. Я назначу, чтобы закрыть ваш вопрос как дубликат. – tripleee

Смежные вопросы