Я просто смотрю на конструкторы StreamReader/Writer, и я отмечаю, что он использует UTF8 по умолчанию. Кто-нибудь знает, почему это? Я бы предположил, что это была бы более безопасная ставка по умолчанию для Unicode.Почему .NET Framework StreamReader/Writer по умолчанию используется для кодирования UTF8?
ответ
UTF-8 будет работать с любым документом ASCII и, как правило, более компактен, чем UTF-16, но он по-прежнему охватывает весь Unicode. Я бы сказал, что UTF-8 далеко чаще, чем UTF-16. Это также значение по умолчанию для XML (когда нет спецификации и не указано явное кодирование).
Почему вы думаете, что было бы лучше по умолчанию UTF-16? (Это то, что Encoding.Unicode
есть.)
EDIT: Я подозреваю, вы смущены тем, что может обрабатывать UTF-8. This page описывает это довольно четко, в том числе, как кодируется какой-либо конкретный символ Юникода. Это кодировка с переменной шириной, но она охватывает весь Unicode.
UTF8 is Юникод, более конкретно один из типов кодировки Unicode.
Что еще более важно его обратную совместимость с ASCII, плюс это стандарт по умолчанию для XML и HTML
«Unicode» является именем стандарта, так что нет такой кодировки, как «Unicode». Скорее всего, существуют два метода отображения: UTF и UCS.
Что касается «почему», UTF-8 имеет максимальную совместимость с ASCII.
Ну, в .NET Framework кодировка UTF-16 называется Unicode. (Свойство Encoding.Unicode.) Это не помогает с путаницей. ;) – Guffa
Как уже отмечалось, 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.
Я бы предположил, что (исправьте меня, как я ошибаюсь;)), поскольку .NET изначально использует UTF16 для строк, будут сценарии (возможно, в разных культурах), где он пытается вывести символ, который не может обрабатывать UTF8. – Quibblesome
UTF-8 обрабатывает все символы Юникода. –
@Quarrelsome UTF-8 - кодировка символов переменной длины, и она может представлять символ _any_ из стандарта Unicode. Он будет использовать больше октетов (8-разрядных байтов), до четырех из них. –