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


Кодовая страница

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

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

Заметка

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

 

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

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

Заметка

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

 

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

Кодовая страница Windows также иногда называется "активными кодовой страницой" или "системными активными кодовая страницами". Операционная система Windows всегда имеет одну активную в настоящее время кодовую страницу Windows. Все версии функций API ANSI использовать текущую активную кодовую страницу.

Исходные кодовые страницы изготовителя оборудования — это кодовые страницы, для которых значения, отличные от 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).

наборы символов