Я просто смотрю на конструкторы 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.
- 1. UTF8 кодирования для переменной
- 2. Строка проблема кодирования UTF8
- 3. Почему .net использует кодировку UTF16 для строки, но использует utf8 по умолчанию для сохранения файлов?
- 4. Почему ShiroWebModule по умолчанию используется недействительным SessionManager?
- 5. Почему std :: reference_wrapper не используется по умолчанию?
- 6. Почему «accept_mutex» по умолчанию используется в Nginx?
- 7. Решение ошибки: неуправляемый символ для кодирования UTF8
- 8. Кодирования аравийского использования UTF8
- 9. Обнаружение ошибок кодирования utf8
- 10. JSON ошибки кодирования utf8
- 11. Почему по умолчанию используется широкоформатный поток данных на C++?
- 12. ОШИБКА: неверная последовательность байтов для кодирования «UTF8»
- 13. Значение по умолчанию для хэша не используется
- 14. Почему Байт не используется по умолчанию для перечислений?
- 15. Java: Почему значение по умолчанию для XX: SurvivorRatio не используется?
- 16. Pandas: Почему используется тип столбца по умолчанию для числового поплавка?
- 17. питон проблема кодирования - utf8 кодирования не работает
- 18. Почему .NET использует округление банкира по умолчанию?
- 19. какая функция кодирования unescape() используется?
- 20. аргумент по умолчанию не используется
- 21. Неверная последовательность байтов для кодирования "UTF8"
- 22. postgres неверная последовательность байтов для кодирования «UTF8»
- 23. России кодирования с utf8 PHPMYADMIN
- 24. Maven JBehave: история кодирования UTF8
- 25. Почему в стандартном стандартном синтаксисе по умолчанию для класса IntelliJ используется код javadoc по умолчанию?
- 26. PostgreSQL + PHP + UTF8 = некорректная последовательность байтов для кодирования
- 27. Python кодирования ISO в utf8
- 28. потоки с обработкой utf8 по умолчанию
- 29. Bean @ По умолчанию используется весна
- 30. Невозможно преобразовать UTF8 в кодировку по умолчанию
Я бы предположил, что (исправьте меня, как я ошибаюсь;)), поскольку .NET изначально использует UTF16 для строк, будут сценарии (возможно, в разных культурах), где он пытается вывести символ, который не может обрабатывать UTF8. – Quibblesome
UTF-8 обрабатывает все символы Юникода. –
@Quarrelsome UTF-8 - кодировка символов переменной длины, и она может представлять символ _any_ из стандарта Unicode. Он будет использовать больше октетов (8-разрядных байтов), до четырех из них. –