2009-05-13 2 views
1

Я просто смотрю на конструкторы StreamReader/Writer, и я отмечаю, что он использует UTF8 по умолчанию. Кто-нибудь знает, почему это? Я бы предположил, что это была бы более безопасная ставка по умолчанию для Unicode.Почему .NET Framework StreamReader/Writer по умолчанию используется для кодирования UTF8?

ответ

6

UTF-8 будет работать с любым документом ASCII и, как правило, более компактен, чем UTF-16, но он по-прежнему охватывает весь Unicode. Я бы сказал, что UTF-8 далеко чаще, чем UTF-16. Это также значение по умолчанию для XML (когда нет спецификации и не указано явное кодирование).

Почему вы думаете, что было бы лучше по умолчанию UTF-16? (Это то, что Encoding.Unicode есть.)

EDIT: Я подозреваю, вы смущены тем, что может обрабатывать UTF-8. This page описывает это довольно четко, в том числе, как кодируется какой-либо конкретный символ Юникода. Это кодировка с переменной шириной, но она охватывает весь Unicode.

+0

Я бы предположил, что (исправьте меня, как я ошибаюсь;)), поскольку .NET изначально использует UTF16 для строк, будут сценарии (возможно, в разных культурах), где он пытается вывести символ, который не может обрабатывать UTF8. – Quibblesome

+1

UTF-8 обрабатывает все символы Юникода. –

+1

@Quarrelsome UTF-8 - кодировка символов переменной длины, и она может представлять символ _any_ из стандарта Unicode. Он будет использовать больше октетов (8-разрядных байтов), до четырех из них. –

6

UTF8 is Юникод, более конкретно один из типов кодировки Unicode.

Что еще более важно его обратную совместимость с ASCII, плюс это стандарт по умолчанию для XML и HTML

2

«Unicode» является именем стандарта, так что нет такой кодировки, как «Unicode». Скорее всего, существуют два метода отображения: UTF и UCS.

Что касается «почему», UTF-8 имеет максимальную совместимость с ASCII.

+1

Ну, в .NET Framework кодировка UTF-16 называется Unicode. (Свойство Encoding.Unicode.) Это не помогает с путаницей. ;) – Guffa

2

Как уже отмечалось, UTF-8 является стандартом кодирования в Unicode. UTF-8 использует переменное количество байтов для кодирования всех символов Unicode.

Все символы ASCII представлены как есть, так что файлы ASCII можно читать с дальнейшим ado. Как только байт в потоке имеет 8-й бит (старший бит,> 127), это заставляет читателя объединить его со следующим байтом, пока это не будет < 128. Затем комбинация считается 1 символом.

В LATIN-1 (ANSII) есть символы, которые кодируются с использованием двух символов: например, é кодируется как e и '. Длина ('é') поэтому равна 2.

Windows использует UTF-16 внутренне, что ограничивает кодируемые символы до 64K, что далеко не все символы Unicde. UTF-32 на данный момент позволяет всем персонажам, но также искусственно ограничено. И оба не совместимы снизу вверх с ASCII, как ведущие нули:

A = ASCII h41 = UTF-8 h41 = UTF-16 h0041 = UTF-32 h00000041 

Есть также маленькие и большие Endian кодировок:

A = UTF-16 big endian h0041 = UTF-16 little endian h4100 

Представьте себе, используя UTF16 или UTF32 для сохранения файлов. Они были бы (для текстовых файлов) размером в две или четыре группы по сравнению с ASCII и UTF-8 (UTF-8, если используются только символы ascii). UTF-8 не только позволяет использовать все символы в стандарте Юникода, даже для будущих улучшений, но также экономит пространство.

Как правило, используются первые два байта файла, спецификация или байтовый указатель порядка, какой стандарт кодирования используется. Если пропустить, XML и StreamRedaer используют UTF-8, как вы узнали. Это опять-таки приводит к тому, что файлы ASCII не имеют спецификации и, следовательно, в большинстве случаев читаются правильно.Это может быть неверно для файлов, использующих все LATIN-1.

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