Непонятно, что вы подразумеваете под «совместимостью», поэтому давайте разберем некоторые основы.
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/
no. они несовместимы. – i486
Что вы подразумеваете под «рукой»? Они кодируют один и тот же набор символов, но последовательность байтов в UTF-8 не будет представлять один и тот же набор символов, если он интерпретируется как UTF-16. Это действительно поможет, если вы расскажете больше о том, что вы пытаетесь сделать. –
Возможный дубликат [Разница между UTF-8 и UTF-16?] (Http://stackoverflow.com/questions/4655250/difference-between-utf-8-and-utf-16) – tripleee