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

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

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

Примечание

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

 

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

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

Примечание

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

 

Многие функции API Windows имеют версии "A" (ANSI) и "W" (широкий, Юникод). Версия "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).

Кодировки