Поделиться через


Общие представления о кодировках

Обновлен: Ноябрь 2007

Внутреннее хранение текста в .NET Framework осуществляется в кодировке Юникод UTF-16. Преобразование текстовых данных в последовательность байтов осуществляется с помощью кодировщика. Преобразование последовательности байтов во внутренний формат осуществляется с помощью декодера. Кодировка описывает набор правил, используемых при работе кодировщика и декодера. Например, класс UTF8Encoding описывает правила кодирования и декодирования последовательности байтов, представляющей текст, в формате Юникод UTF-8. В процессе кодирования и декодирования также выполняются определенные действия по проверке. Например, класс UnicodeEncoding предназначен для проверки допустимости пар, составляемых всеми символами-заместителями. Оба описанных выше класса наследуются от класса Encoding.

Выбор кодировки

В стандарте Юникода каждому символу в каждом поддерживаемом сценарии присваивается кодовая точка (номер). UTF – это формат, используемый для кодирования кодовых точек. Дополнительные сведения о форматах UTF, поддерживаемых классами System.Text, см. в пункте "Использование кодировки Юникода" в разделе Юникод в .NET Framework.

Выбор класса кодировки Encoding

Класс Encoding является общим. Поддерживаемые классы, унаследованные от Encoding, обеспечивают работу приложений .NET со стандартными кодировками, наиболее часто встречающимися в существующих приложениях, а также позволяют реализовывать дополнительные кодировки. Несмотря на то, что можно выбрать другую кодировку, настоятельно рекомендуется использовать кодировку Юникод, чаще всего UTF8Encoding или UnicodeEncoding (также поддерживается кодировка UTF32Encoding). В частности, кодировка UTF8Encoding является более предпочтительной, чем ASCIIEncoding. Если содержимое имеет формат ASCII, обе кодировки являются идентичными. Однако кодировка UTF8Encoding также поддерживает представление всех символов Юникода, тогда как ASCIIEncoding поддерживает только значения символов Юникода от U+0000 до U+007F. Поскольку для ASCIIEncoding не предусматривается функция обнаружения ошибок, кодировка UTF8Encoding также является более предпочтительной в отношении безопасности.

Настройки кодировки UTF8Encoding обеспечивают максимально высокую производительность по сравнению с любыми другими кодировками. Даже для содержимого, имеющего только формат ASCII, при использовании UTF8Encoding обеспечивается более высокая производительность операций, чем при использовании ASCIIEncoding. Кодировку ASCIIEncoding рекомендуется использовать только для определенных существующих приложений. Однако даже в этих случаях применение кодировки UTF8Encoding может быть предпочтительным. При использовании настроек по умолчанию возможен следующий сценарий:

  • Если содержимое приложения включает символы не только в формате ASCII, при кодировании с помощью ASCIIEncoding каждый символ, отличный от ASCII, кодируется с помощью знака вопроса ("?"). При последующем декодировании эти данные утрачиваются.

  • Если содержимое приложения включает символы не только в формате ASCII, при кодировании с помощью UTF8Encoding представление символов в формате ASCII дает непригодный для чтения результат. Однако при последующем декодировании обработка данных выполняется успешно.

Выбор стратегии перехода на запасные ресурсы

Если при попытке кодирования или декодирования символа не обнаруживается соответствующее сопоставление, реализуется стратегия перехода на запасные ресурсы, представляющая собой механизм обработки сбоев. Существует два вида стратегий перехода на запасные ресурсы:

  1. Стратегия наилучшего соответствия

    Если в целевой кодировке отсутствует точное соответствие для символа, предпринимается попытка его сопоставления с наиболее похожим символом.

  2. Стратегия замещающей строки

    Если подходящий похожий символ отсутствует, в приложении можно указать замещающую строку.

Например, в приложении можно вызвать метод GetEncoding(1252, 0, 0) (см. метод GetEncoding). Этот метод задает кодовую страницу 1252 (кодовая страница Windows для западноевропейских языков) и устанавливает нулевые значения для параметров encoderFallback и decoderFallback. По умолчанию для определенных символов Юникода применяется стратегия наилучшего соответствия. Например, ПРОПИСНАЯ ЛАТИНСКАЯ БУКВА S В КРУЖКЕ (U+24C8) перед кодированием заменяется на ПРОПИСНУЮ ЛАТИНСКУЮ БУКВУ S (U+0053). НАДСТРОЧНЫЙ ИНДЕКС 5 (U+2075) заменяется на ЦИФРУ 5 (U+0035). При последующем декодировании символов кодовой страницы 1252 в формат Юникод, кружок вокруг буквы утрачивается, а строка 25 преобразуется в строку 25. Последствия других преобразований могут быть еще более серьезными. Например, символ Юникода БЕСКОНЕЧНОСТЬ (U+221E) может быть преобразован в ЦИФРУ 8 (U+0038).

Стратегии наилучшего соответствия для разных кодовых страниц различаются. Не все стратегии подробно задокументированы. Например, для некоторых кодовых страниц полноширинные латинские символы сопоставляются с более распространенными полуширинными символами. Для других кодовых страниц такое сопоставление не выполняется.

Даже в случае применения активной стратегии наилучшего соответствия для некоторых символов некоторых кодировок отсутствует возможное сопоставление. Например, для идеографических символов китайского алфавита отсутствуют корректные сопоставления с символами кодовой страницы 1252. В этом случае используются замещающие строки. По умолчанию в качестве замещающей строки используется ЗНАК ВОПРОСА (U+003F).

По умолчанию для кодировки Encoding применяется стратегия наилучшего соответствия, при которой осуществляется кодирование данных в формате Юникод в формат кодовой страницы. Данная стратегия применяется в ряде существующих приложений. Однако в целях безопасности в большинстве новых приложений не рекомендуется применять эту стратегию. Например, при вводе имени домена в приложении не следует использовать стратегию наилучшего соответствия.

В приложениях рекомендуется использовать следующие альтернативы стратегии наилучшего соответствия:

  • Применение только кодировок Юникод (UTF8Encoding, UnicodeEncoding и UTF32Encoding), чтобы избежать необходимости использовать запасные ресурсы.

    ms404377.alert_caution(ru-ru,VS.90).gifВнимание!

    Поскольку кодировка UTF7Encoding формально является кодировкой Юникод, она является менее устойчивой и безопасной по сравнению с другими кодировками. В некоторых случаях изменение одного бита может привести к существенному изменению интерпретации всей строки UTF-7. В других ситуациях для кодировки одного и того же текста могут использоваться значительно различающиеся строки UTF-7. В связи с этим кодировку UTF-7 рекомендуется использовать только при отсутствии других вариантов. Кодировка UTF-8 является более предпочтительной, чем UTF-7.

  • Если для символа отсутствует точное соответствие, используйте EncoderExceptionFallback и DecoderExceptionFallback, порождающие исключения (EncoderFallbackException и DecoderFallbackException соответственно).

  • Если для символа отсутствует точное соответствие, всегда следует использовать EncoderReplacementFallback и DecoderReplacementFallback для замены замещающей строки. Это поведение установлено по умолчанию для кодировки ASCIIEncoding. По умолчанию в качестве замещающей строки используется знак вопроса, однако существуют методы для выбора другой строки. Замещающая строка обычно содержит один символ (необязательное требование). Для метода DecoderReplacementFallback, который используется для преобразования текста в формат Юникод, обычно используется один ЗАМЕЩАЮЩИЙ СИМВОЛ (U+FFFD).

  • Для реализации предпочитаемой стратегии следует использовать настраиваемые методы EncoderFallback и DecoderFallback. См. Пример Fallback Encoding Application.

Дополнительные примечания о стратегиях наилучшего соответствия для перехода на запасные ресурсы при кодировании (декодировании):

  • Проблемы при использовании стратегии наилучшего соответствия возникают преимущественно при кодировании. Существует лишь небольшое число кодовых страниц, символы которых не могут быть преобразованы в формат Юникод. Поскольку такие символы не распространены, они не включены в таблицу символов Юникода.

  • Для стратегий наилучшего соответствия отсутствуют поддерживаемые именованные объекты. Для каждой кодовой страницы применяется особая стратегия наилучшего соответствия для перехода на запасные ресурсы. Если в приложении необходимо реализовать переключение между стратегией наилучшего соответствия и другими стратегиями перехода на запасные ресурсы для одного объекта Encoding, следует скопировать исходный объект стратегии наилучшего соответствия перед назначением любого другого объекта стратегии. В этом случае для восстановления объекта стратегии наилучшего соответствия в приложении следует повторно присвоить свойство Encoding.EncoderFallback или Encoding.DecoderFallback.

См. также

Задачи

Пример Fallback Encoding Application

Ссылки

Decoding

DecoderFallback

Encoding

EncoderFallback

Другие ресурсы

Шифрование и локализация