Windows code pages are sets of characters or code pages (known as character encodings in other operating systems) used in Microsoft Windows from the 1980s and 1990s. Windows code pages were gradually superseded when Unicode was implemented in Windows, although they are still supported both within Windows and other platforms.
There are two groups of code pages in Windows systems: OEM and Windows-native ("ANSI") code pages. Code pages in both of these groups are extended ASCII code pages.
ANSI code page
|Standard||WHATWG Encoding Standard|
|Preceded by||ISO 8859|
UTF-16 (in Win32 API)
ANSI code pages (officially called "Windows code pages" after Microsoft accepted the former term being a misnomer) are used for native non-Unicode (say, byte oriented) applications using a graphical user interface on Windows systems. "ANSI" is a misnomer because the behavior does not exactly match the ANSI standard[which?] and because some non-ANSI standard encodings are included in these 8-bit code pages.
Most legacy "ANSI" code pages have code page numbers in the pattern 125x. However, 874 (Thai) and the East Asian multi-byte "ANSI" code pages (932, 936, 949, 950), all of which are also used as OEM code pages, are numbered to match similar (but not identical) IBM encodings. While code page 1258 is also used as an OEM code page, it is original to Microsoft rather than an extension to an existing encoding. IBM have assigned their own, different numbers for Microsoft's variants, these are given for reference in the lists below where applicable.
All of the 125x Windows code pages, as well as 874 and 936, are labelled by Internet Assigned Numbers Authority (IANA) as "Windows-number", although "Windows-936" is treated as a synonym for "GBK". Windows code page 932 is instead labelled as "Windows-31J".
ANSI Windows code pages, and especially the code page 1252, were so-called since they were purportedly based on drafts submitted or intended for ANSI. However, ANSI and ISO have not standardized any of these code pages. Instead they are either:
- Supersets of the standard sets such as those of ISO 8859 and the various national standards (like Windows-1252 vs. ISO-8859-1),
- Major modifications of these (making them incompatible to various degrees, like Windows-1250 vs. ISO-8859-2)
- Having no parallel encoding (like Windows-1257 vs. ISO-8859-4; ISO-8859-13 was introduced much later). Also, Windows-1251 follows neither the ISO-standardised ISO-8859-5 nor the then-prevailing KOI-8.
Microsoft assigned about twelve of the typography and business characters (including notably, the euro sign, €) in CP1252 to the code points 0x80–0x9F that, in ISO 8859, are assigned to C1 control codes. These assignments are also present in many other ANSI/Windows code pages at the same code-points. Windows did not use the C1 control codes, so this decision had no direct effect on Windows users. However, if included in a file transferred to a standards-compliant platform like Unix or MacOS, the information was invisible and potentially disruptive.
OEM code page
The OEM code pages (original equipment manufacturer) are used by Win32 console applications, and by virtual DOS, and can be considered a holdover from DOS and the original IBM PC architecture. A separate suite of code pages was implemented not only due to compatibility, but also because the fonts of VGA (and descendant) hardware suggest encoding of line drawing characters to be compatible with code page 437. Most OEM code pages share many code points, particularly for non-letter characters, with the second (non-ASCII) half of CP437.
A typical OEM code page, in its second half, does not resemble any ANSI/Windows code page even roughly. Nevertheless, two single-byte, fixed-width code pages (874 for Thai and 1258 for Vietnamese) and four multibyte CJK code pages (932, 936, 949, 950) are used as both OEM and ANSI code pages. Code page 1258 uses combining diacritics, as Vietnamese requires more than 128 letter-diacritic combinations. This is in contrast to VISCII, which replaces some of the C0 (i.e. ASCII) control codes.
Initially, computer systems and system programming languages did not make a distinction between characters and bytes: for the segmental scripts used in most of Africa, the Americas, southern and south-east Asia, the Middle East and Europe, a character needs just one byte, but two or more bytes are needed for the ideographic sets used in the rest of the world. This led to much confusion subsequently. Microsoft software and systems prior to the Windows NT line are examples of this, because they use the OEM and ANSI code pages that do not make the distinction.
Since the late 1990s, software and systems have adopted Unicode as their preferred storage format; this trend has been improved by the widespread adoption of XML, which provides a more adequate mechanism for labelling the encoding used. Recent Microsoft products and application program interfaces use Unicode internally, but many applications and APIs continue to use the default encoding of the computer's 'locale' when reading and writing text data to files or standard output. Therefore, files may still be encountered that are legible and intelligible in one part of the world but unintelligible mojibake in another.
Microsoft decided to adopt the 16-bit (two-byte) UTF-16 system for all its operating systems from Windows NT onwards. This method encodes uniquely all Unicode characters in the Basic Multilingual Plane and a 32-bit (four byte) code for others – but the rest of the industry[clarification needed] chose UTF-8 (which uses one byte for the 7-bit ASCII character set, two or three bytes for other characters in the BMP, and four bytes for the remainder). Since Windows 10 version 1803, Windows machines can be configured to allow UTF-8 as the "ANSI" and OEM codepage.
The following Windows code pages exist:
These nine code pages are all extended ASCII 8-bit SBCS encodings, and were designed by Microsoft for use as ANSI codepages on Windows. They are commonly known by their IANA-registered names as
windows-<number>, but are also sometimes called
cp<number>, "cp" for "code page". They are all used as ANSI code pages; Windows-1258 is also used as an OEM code page.
|ID||Description||Relationship to ISO 8859 or other established encodings|
|1250||Latin 2 / Central European||Similar to ISO-8859-2 but moves several characters, including multiple letters.|
|1251||Cyrillic||Incompatible with both ISO-8859-5 and KOI-8.|
|1252||Latin 1 / Western European||Superset of ISO-8859-1 (without C1 controls). Letter repertoire accordingly similar to CP850.|
|1253||Greek||Similar to ISO 8859-7 but moves several characters, including a letter.|
|1254||Turkish||Superset of ISO 8859-9 (without C1 controls).|
|1255||Hebrew||Almost a superset of ISO 8859-8, but with two incompatible punctuation changes.|
|1256||Arabic||Not compatible with ISO 8859-6; rather, OEM Code page 708 is an ISO 8859-6 (ASMO 708) superset.|
|1257||Baltic||Not ISO 8859-4; the later ISO 8859-13 is closely related, but with some differences in available punctuation.|
|1258||Vietnamese (also OEM)||Not related to VSCII or VISCII, uses fewer base characters with combining diacritics.|
DOS code pages
These are also ASCII-based. Most of these are included for use as OEM code pages; code page 874 is also used as an ANSI code page.
- 437 – IBM PC US, 8-bit SBCS extended ASCII. Known as OEM-US, the encoding of the primary built-in font of VGA graphics cards.
- 708 – Arabic, extended ISO 8859-6 (ASMO 708)
- 720 – Arabic, retaining box drawing characters in their usual locations
- 737 – "MS-DOS Greek". Retains all box drawing characters. More popular than 869.
- 775 – "MS-DOS Baltic Rim"
- 850 – "MS-DOS Latin 1". Full (re-arranged) repertoire of ISO 8859-1.
- 852 – "MS-DOS Latin 2"
- 855 – "MS-DOS Cyrillic". Mainly used for South Slavic languages. Includes (re-arranged) repertoire of ISO-8859-5. Not to be confused with cp866.
- 857 – "MS-DOS Turkish"
- 858 – Western European with euro sign
- 860 – "MS-DOS Portuguese"
- 861 – "MS-DOS Icelandic"
- 862 – "MS-DOS Hebrew"
- 863 – "MS-DOS French Canada"
- 864 – Arabic
- 865 – "MS-DOS Nordic"
- 866 – "MS-DOS Cyrillic Russian", cp866. Sole purely OEM code page (rather than ANSI or both) included as a legacy encoding in WHATWG Encoding Standard for HTML5.
- 869 – "MS-DOS Greek 2", IBM869. Full (re-arranged) repertoire of ISO 8859-7.
- 874 – Thai, also used as the ANSI code page, extends ISO 8859-11 (and therefore TIS-620) with a few additional characters from Windows-1252. Corresponds to IBM code page 1162 (IBM-874 is similar but has different extensions).
East Asian multi-byte code pages
These often only partly match the IBM code pages of the same number: code pages 932, 936 and 949 differ from the IBM code pages of the same number, whereas Windows-951, as part of a kludge, is unrelated to IBM-951. IBM equivalent code pages are given in the second column. Code pages 932, 936, 949 and 950/951 are used as both ANSI and OEM code pages on the locales in question.
|932||943||Japanese||Shift JIS (Microsoft variant)||ANSI/OEM (Japan)|
|936||1386||Chinese (simplified)||GBK||ANSI/OEM (PRC, Singapore)|
|949||1363||Korean||Unified Hangul Code||ANSI/OEM (Republic of Korea)|
|950||1370, 1373||Chinese (traditional)||Big5 (Microsoft variant)||ANSI/OEM (Taiwan, Hong Kong)|
|951||5471||Chinese (traditional)||Big5-HKSCS (2001 ed.)||ANSI/OEM (Hong Kong, 98/NT4/2000/XP with HKSCS patch)|
A few further multiple-byte code pages are supported for decoding or encoding using operating system libraries, but not used as either sort of system encoding in any locale.
|1361||-||Korean||Johab (KS C 5601-1992 annex 3)||Conversion|
|20000||964||Chinese (traditional)||CNS 11643||Conversion|
|20002||-||Chinese (traditional)||Big5 (ETEN variant)||Conversion|
|20003||?||Chinese (traditional)||IBM 5500||Conversion|
EBCDIC code pages
- 37 – IBM EBCDIC US-Canada, 8-bit SBCS
- 500 – Latin 1
- 870 – IBM870
- 875 – cp875
- 1026 – EBCDIC Turkish
- 1047 – IBM01047 – Latin 1
- 1140 – IBM01141
- 1141 – IBM01141
- 1142 – IBM01142
- 1143 – IBM01143
- 1144 – IBM01144
- 1145 – IBM01145
- 1146 – IBM01146
- 1147 – IBM01147
- 1148 – IBM01148
- 1149 – IBM01149
- 20273 – EBCDIC Germany
- 20277 – EBCDIC Denmark/Norway
- 20278 – EBCDIC Finland/Sweden
- 20280 – EBCDIC Italy
- 20284 – EBCDIC Latin America/Spain
- 20285 – EBCDIC United Kingdom
- 20290 – EBCDIC Japanese
- 20297 – EBCDIC France
- 20420 – EBCDIC Arabic
- 20423 – EBCDIC Greek
- 20424 – x-EBCDIC-KoreanExtended
- 20833 – Korean
- 20838 – EBCDIC Thai
- 21025 – EBCDIC Cyrillic
- 20871 – EBCDIC Icelandic
- 20880 – EBCDIC Cyrillic
- 20905 – EBCDIC Turkish
- 21027 – Japanese EBCDIC (incomplete, deprecated)
- 1200 – Unicode (BMP of ISO 10646, UTF-16LE). Available only to managed applications 
- 1201 – Unicode (UTF-16BE). Available only to managed applications 
- 12000 – utf-32. Available only to managed applications 
- 12001 – utf-32 Big endian. Available only to managed applications 
- 65000 – Unicode (UTF-7)
- 65001 – Unicode (UTF-8)
Macintosh compatibility code pages
- 10000 – Apple Macintosh Roman
- 10001 – Apple Macintosh Japanese
- 10002 – Apple Macintosh Chinese (traditional) (BIG-5)
- 10003 – Apple Macintosh Korean
- 10004 – Apple Macintosh Arabic
- 10005 – Apple Macintosh Hebrew
- 10006 – Apple Macintosh Greek
- 10007 – Apple Macintosh Cyrillic
- 10008 – Apple Macintosh Chinese (simplified) (GB 2312)
- 10010 – Apple Macintosh Romanian
- 10017 – Apple Macintosh Ukrainian
- 10021 – Apple Macintosh Thai
- 10029 – Apple Macintosh Roman II / Central Europe
- 10079 – Apple Macintosh Icelandic
- 10081 – Apple Macintosh Turkish
- 10082 – Apple Macintosh Croatian
ISO 8859 code pages
- 28591 – ISO-8859-1 – Latin-1 (IBM equivalent: 819)
- 28592 – ISO-8859-2 – Latin-2
- 28593 – ISO-8859-3 – Latin-3 or South European
- 28594 – ISO-8859-4 – Latin-4 or North European
- 28595 – ISO-8859-5 – Latin/Cyrillic
- 28596 – ISO-8859-6 – Latin/Arabic
- 28597 – ISO-8859-7 – Latin/Greek
- 28598 – ISO-8859-8 – Latin/Hebrew
- 28599 – ISO-8859-9 – Latin-5 or Turkish
- 28600 – ISO-8859-10 – Latin-6
- 28601 – ISO-8859-11 – Latin/Thai
- 28602 – ISO-8859-12 – reserved for Latin/Devanagari but abandoned (not supported)
- 28603 – ISO-8859-13 – Latin-7 or Baltic Rim
- 28604 – ISO-8859-14 – Latin-8 or Celtic
- 28605 – ISO-8859-15 – Latin-9
- 28606 – ISO-8859-16 – Latin-10 or South-Eastern European
- 38596 – ISO-8859-6-I – Latin/Arabic (logical bidirectional order)
- 38598 – ISO-8859-8-I – Latin/Hebrew (logical bidirectional order)
ITU-T code pages
KOI8 code pages
Other code pages
- 20924 – IBM00924 – IBM EBCDIC Latin 1/Open System (1047 + Euro symbol)
- 20936 – x-cp20936 – Simplified Chinese (GB2312); Chinese Simplified (GB2312-80)
- 20949 – x-cp20949 – Korean Wansung
Problems arising from the use of code pages
Microsoft strongly recommends using Unicode in modern applications, but many applications or data files still depend on the legacy code pages.
- Programs need to know what code page to use in order to display the contents of (pre-Unicode) files correctly. If a program uses the wrong code page it may show text as mojibake.
- The code page in use may differ between machines, so (pre-Unicode) files created on one machine may be unreadable on another.
- Data is often improperly tagged with the code page, or not tagged at all, making determination of the correct code page to read the data difficult.
- These Microsoft code pages differ to various degrees from some of the standards and other vendors' implementations. This isn't a Microsoft issue per se, as it happens to all vendors, but the lack of consistency makes interoperability with other systems unreliable in some cases.
- The use of code pages limits the set of characters that may be used.
- Characters expressed in an unsupported code page may be converted to question marks (?) or other replacement characters, or to a simpler version (such as removing accents from a letter). In either case, the original character may be lost.
- AppLocale – a utility to run non-Unicode (code page-based) applications in a locale of the user's choice.
- Code Pages, MSDN
- MSDN: Glossary of Terms
- IANA list of Character Sets
- "Extensible Markup Language (XML) 1.1 (Second Edition): Character encodings". W3C. 29 September 2006. Retrieved 5 October 2020.
- hylom (2017-11-14). "Windows 10のInsider PreviewでシステムロケールをUTF-8にするオプションが追加される" [The option to make UTF-8 the system locale added in Windows 10 Insider Preview]. スラド (in Japanese). Retrieved 2018-05-10.
- "Character Sets". IANA.
- Microsoft. "Windows 1250". Retrieved 2014-07-06.
- IBM. "SBCS code page information document CPGID 01250". Retrieved 2014-07-06.
- Microsoft. "Windows 1251". Retrieved 2014-07-06.
- IBM. "SBCS code page information document CPGID 01251". Retrieved 2014-07-06.
- Microsoft. "Windows 1252". Retrieved 2014-07-06.
- IBM. "SBCS code page information document CPGID 01252". Retrieved 2014-07-06.
- Microsoft. "Windows 1253". Retrieved 2014-07-06.
- IBM. "SBCS code page information document CPGID 01253". Retrieved 2014-07-06.
- Microsoft. "Windows 1254". Retrieved 2014-07-06.
- IBM. "SBCS code page information document CPGID 01254". Retrieved 2014-07-06.
- Microsoft. "Windows 1255". Retrieved 2014-07-06.
- IBM. "SBCS code page information document CPGID 01255". Retrieved 2014-07-06.
- Microsoft. "Windows 1256". Retrieved 2014-07-06.
- IBM. "SBCS code page information document CPGID 01256". Retrieved 2014-07-06.
- Microsoft. "Windows 1257". Retrieved 2014-07-06.
- IBM. "SBCS code page information document CPGID 01257". Retrieved 2014-07-06.
- Microsoft. "Windows 1258". Retrieved 2014-07-06.
- IBM. "SBCS code page information document CPGID 01258". Retrieved 2014-07-06.
- IBM. "SBCS code page information document - CPGID 00437". Retrieved 2014-07-04.
- "IBM-943 and IBM-932". IBM Knowledge Center. IBM.
- "CCSID 1370 information document". Archived from the original on 2016-03-27.
- "Converter Explorer: ibm-1373_P100-2002". ICU Demonstration. International Components for Unicode.
- "Coded character set identifiers – CCSID 5471". IBM Globalization. IBM. Archived from the original on 2014-11-29.
- IBM. "SBCS code page information document - CPGID 00037". Retrieved 2014-07-04.
- Steele, Shawn (2005-09-12). "Code Page 21027 "Extended/Ext Alpha Lowercase"". MSDN.
- Code Page Identifiers
- Code page identifier list
- "Code Page Identifiers". Microsoft Developer Network. Microsoft. 2014. Archived from the original on 2016-06-19. Retrieved 2016-06-19.
- "Web Encodings - Internet Explorer - Encodings". WHATWG Wiki. 2012-10-23. Archived from the original on 2016-06-20. Retrieved 2016-06-20.
- Foller, Antonin (2014) . "Western European (IA5) encoding - Windows charsets". WUtils.com - Online web utility and help. Motobit Software. Archived from the original on 2016-06-20. Retrieved 2016-06-20.
- Foller, Antonin (2014) . "German (IA5) encoding – Windows charsets". WUtils.com – Online web utility and help. Motobit Software. Archived from the original on 2016-06-20. Retrieved 2016-06-20.
- Foller, Antonin (2014) . "Swedish (IA5) encoding - Windows charsets". WUtils.com - Online web utility and help. Motobit Software. Archived from the original on 2016-06-20. Retrieved 2016-06-20.
- Foller, Antonin (2014) . "Norwegian (IA5) encoding - Windows charsets". WUtils.com - Online web utility and help. Motobit Software. Archived from the original on 2016-06-20. Retrieved 2016-06-20.
- Foller, Antonin (2014) . "US-ASCII encoding - Windows charsets". WUtils.com - Online web utility and help. Motobit Software. Archived from the original on 2016-06-20. Retrieved 2016-06-20.
- Nechayev, Valentin (2013) . "Review of 8-bit Cyrillic encodings universe". Archived from the original on 2016-12-05. Retrieved 2016-12-05.
- National Language Support (NLS) API Reference. Table showing ANSI and OEM codepages per language (from web-archive since Microsoft removed the original page)
- IANA Charset Name Registrations
- Unicode mapping table for Windows code pages
- Unicode mappings of windows code pages with "best fit"