.NET Framework использует кодировку Windows по умолчанию для хранения строк, которая оказывается UTF-16. Если вы не задаете кодировку при использовании большинства текстовых классов ввода-вывода, вы напишите UTF-8 без спецификации и прочитаете, сначала проверив наличие спецификации, а затем предположив UTF-8 (я точно знаю StreamReader
и StreamWriter
ведут себя так.) Это довольно безопасно для «глупых» текстовых редакторов, которые не понимают спецификацию, но отчасти грубее для более умных, которые могут отображать UTF-8 или ситуацию, когда вы фактически пишете символы вне стандарта Диапазон ASCII.
Обычно это невидимо, но может поднять голову интересными способами. Вчера я работал с кем-то, кто использовал сериализацию XML для сериализации объекта в строку, используя StringWriter
, и он не мог понять, почему кодировка всегда была UTF-16. Так как строка в памяти будет UTF-16, и это обеспечивается .NET, это единственное, что может сделать среда сериализации XML.
Итак, когда я пишу что-то, что не является одноразовым инструментом, я указываю кодировку UTF-8 с помощью спецификации. Технически в .NET вы всегда будете случайно осведомлены о Unicode, но только если ваш пользователь знает, чтобы определить вашу кодировку как UTF-8.
Это заставляет меня немного плакать каждый раз, когда я вижу, что кто-то спрашивает: "Как я могу получить байты строки?" и предлагаемое решение использует Encoding.ASCII.GetBytes()
: (