Почему .NET Framework StreamReader / Writer по умолчанию использует кодировку UTF8? - PullRequest
1 голос
/ 13 мая 2009

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

Ответы [ 4 ]

6 голосов
/ 13 мая 2009

UTF8 - это Unicode, точнее один из типов кодировки Unicode.

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

6 голосов
/ 13 мая 2009

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

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

РЕДАКТИРОВАТЬ: Я подозреваю, что вы не понимаете, что именно UTF-8 может обрабатывать. Эта страница описывает это довольно четко, включая способ кодирования любого конкретного символа Unicode. Это кодирование переменной ширины, но оно охватывает весь Юникод.

2 голосов
/ 13 мая 2009

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

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

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

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

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

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

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

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

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

2 голосов
/ 13 мая 2009

«Юникод» - это название стандарта, поэтому такой кодировки, как «Юникод», не существует. Скорее, есть два метода отображения: UTF и UCS .

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

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