Кодовые страницы

Большинство приложений, написанных сегодня, обрабатывают символьные данные в основном как Юникод, используя кодировку UTF-16. Однако многие устаревшие приложения продолжают использовать наборы символов на основе кодов. Даже новые приложения иногда должны работать с кодовыми страницами, часто по одной из следующих причин:

  • Взаимодействие с устаревшими приложениями.
  • Для взаимодействия со старыми почтовыми серверами и серверами новостей, которые могут не всегда поддерживать Юникод.
  • Взаимодействие с консолью Windows для устаревших целей. (Консоль поддерживает Юникод, но некоторые устаревшие средства приложения командной строки могут не поддерживаться.)

Примечание

Новые Windows приложения должны использовать Юникод, чтобы избежать несоответствий различных кодовых страниц и для простоты локализации.

 

Каждая кодовая страница представлена идентификатором кодовой страницы, например 1252, и обрабатывается функциями API Юникода и набора символов. Список поддерживаемых идентификаторов кодовой страницы см. в разделе "Идентификаторы кодовой страницы". Справочник по кодовой странице в Центре разработчиков Microsoft Go содержит полное описание многих кодовых страниц.

Windows кодовые страницы, обычно называемые "кодовые страницы ANSI", — это кодовые страницы, для которых значения, отличные от ASCII (значения больше 127), представляют международные символы. Эти кодовые страницы используются в собственном коде Windows Я, а также доступны в Windows NT и более поздних версиях.

Примечание

Первоначально Windows кодовая страница 1252, кодовая страница, часто используемая для английского и других языков Западной Европы, была основана на проекте Американского национального института стандартов (ANSI). Этот проект в конечном итоге стал ISO 8859-1, но Windows кодовая страница 1252 была реализована до того, как стандарт стал окончательным, и не совсем так же, как ISO 8859-1.

 

Многие функции API Windows имеют версии A (ANSI) и W (wide, Unicode). Версия "A" обрабатывает текст на основе Windows кодовых страниц, а версия "W" обрабатывает текст Юникода. См. Windows типы данных для строк и соглашений для прототипов функций.

Windows кодовой страницы иногда называются "активными кодовой страницой" или "системными активными кодовими страницами". Операционная система Windows всегда имеет одну активную Windows кодовую страницу. Все версии ФУНКЦИЙ API ANSI используют активную кодовую страницу.

Исходные кодовые страницы изготовителя оборудования (OEM) — это кодовые страницы, для которых значения, отличные от ASCII, представляют символы рисования линий и знаков препинания. Эти кодовые страницы изначально использовались для MS-DOS и по-прежнему используются для консольных приложений. Они также используются для не расширенных имен файлов в файловых системах FAT12, FAT16 и FAT32, как описано в кодировках, используемых в именах файлов. Обычная кодовая страница OEM для английского языка — кодовая страница 437.

Для Windows кодовых страниц и кодовых страниц OEM значения кода 0x00 через 0x7F соответствуют 7-разрядному набору символов ASCII. Значения кода 0x00 через 0x19 и 0x7F всегда представляют стандартизированные управляющие символы и 0x20 через 0x7E представляют стандартизированные отображаемые символы. Символы, представленные остальными кодами, 0x80 через 0xff, различаются между наборами символов. Каждый набор символов включает различные специальные символы, обычно настроенные для языка или группы языков. Windows кодовая страница 1252 и кодовая страница OEM 437 обычно используются в США.

Помимо Windows и кодовых страниц OEM, приложения могут использовать не машинные кодовые страницы. Примерами являются кодовые страницы EBCDIC и Macintosh.

Две кодировки Юникода (UTF-7 и UTF-8) реализуются как кодовые страницы. Как и другие кодовые страницы, каждая страница известна числовым идентификатором и может обрабатываться многими теми же функциями API Юникода и набора символов.

Кодовые страницы могут быть страницами однобайтового набора символов (SBCS) или страницами двухбайтового набора символов (DBCS). На страницах SBCS каждый байт напрямую кодирует один символ, чтобы можно было представить ровно 256 отдельных символов (включая управляющие символы, буквы, цифры, знаки препинания, символы и т. д.). Кодовая страница DBCS используется для таких языков, как японский и китайский. На такой кодовой странице некоторые символы имеют двухбайтовые кодировки с определенными значениями байтов (всегда больше 127), которые служат в качестве "потенциальных байтов". Вместо того чтобы кодировать символы в собственном праве, байты свинца можно сопоставить с символом только в сочетании с "байтом следа".

Для некоторых устаревших протоколов требуется использование кодовых страниц SBCS и DBCS. Каждая кодовая страница SBCS/DBCS поддерживает разные символы, но кодовая страница не поддерживает полный спектр символов, предоставляемых Юникодом. Каждая кодовая страница SBCS/DBCS поддерживает разные подмножества, по-разному закодированное.

Примечание

Данные, преобразованные из одной кодовой страницы SBCS или DBCS, могут быть повреждены, так как одно и то же значение данных на разных кодовых страницах может кодировать другой символ. Данные, преобразованные из Юникода в SBCS или DBCS, подвергаются потере данных, так как данная кодовая страница может не представлять каждый символ, используемый в данных Юникода.

 

Помимо кодовых страниц SBCS и DBCS, в приложениях доступны многобайтовые кодовые страницы 52936, 54936, 51949 и 5022x, которые используют такой подход для DBCS. Кодовая страница набора многобайтовых символов выходит за рамки двухбайтовых кодировок некоторых символов. UTF-7 и UTF-8 используют аналогичный подход для кодирования Юникода на основе 7-разрядных и 8-разрядных байтов соответственно. Дополнительные сведения см. в Юникоде.

Несколько функций Юникода и кодировки позволяют приложениям обрабатывать кодовые страницы. Приложение может использовать функции GetCPInfo и GetCPInfoEx для получения сведений о кодовой странице. Эти сведения включают символ по умолчанию, используемый, если символ в преобразованной строке не имеет соответствующей записи на кодовой странице.

Приложение может использовать функции MultiByteToWideChar и WideCharToMultiByte для преобразования между строками на основе Windows кодовых страниц и строк Юникода. Хотя их имена называются "MultiByte", эти функции работают одинаково хорошо с кодовых страницами набора символов SBCS, DBCS и многобайтовых символов.

Примечание

WideCharToMultiByte может потерять некоторые данные, если указанная кодовая страница не может представлять все символы в строке Юникода.

 

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

Приложения также могут вызывать функцию GetACP . Эта функция извлекает идентификатор текущей кодовой страницы Windows (ANSI).

Кодировки