In computing, a code page is a table of values that describes the character set used for encoding a particular set of glyphs, usually combined with a number of control characters. The term "code page" originated from IBM's EBCDIC-based mainframe systems, but many vendors use this term including Microsoft, SAP, and Oracle Corporation. Vendors often allocate their own code page number to a character encoding, even if it is better known by another name (for example UTF-8 character encoding has code page numbers 1208 at IBM, 65001 at Microsoft, 4110 at SAP).
- 1 The code page numbering system
- 2 Noteworthy code pages
- 3 List of code page assignments
- 4 Criticism
- 5 Private code pages
- 6 See also
- 7 References
- 8 External links
The code page numbering system
IBM introduced the concept of systematically assigning a small, but globally unique, 16 bit number to each character encoding that a computer system or collection of computer systems might encounter. The IBM origin of the numbering scheme is reflected in the fact that the smallest (first) numbers are assigned to variations of IBM's EBCDIC encoding and slightly larger numbers refer to variations of IBM's extended ASCII encoding as used in its PC hardware.
With the release of PC DOS version 3.3 (and the near identical MS-DOS 3.3) IBM introduced the code page numbering system to regular PC users, as the code page numbers (and the phrase "code page") were used in new commands to allow the character encoding used by all parts of the OS to be set in a systematic way.
After IBM and Microsoft ceased to cooperate in the 1990s, the two companies have maintained the list of assigned code page numbers independently from each other, resulting in some conflicting assignments. At least one third-party vendor (Oracle) also has its own different list of numeric assignments. IBM's current assignments are listed in their CCSID repository, while Microsoft's assignments are documented within the MSDN. Additionally, a list of the names and approximate IANA abbreviations for the installed code pages on any given Windows machine can be found in the Registry on that machine (this information is used by Microsoft programs such as Internet Explorer).
Most well-known code pages, excluding those for the CJK languages and Vietnamese, fit all their code-points into eight bits and do not involve anything more than mapping each code-point to a single character; furthermore, techniques such as combining characters, complex scripts, etc., are not involved.
The text mode of standard (VGA-compatible) PC graphics hardware is built around using an 8-bit code page, though it is possible to use two at once with some color depth sacrifice, and up to eight may be stored in the display adaptor for easy switching. There was a selection of third-party code page fonts that could be loaded into such hardware. However, it is now commonplace for operating system vendors to provide their own character encoding and rendering systems that run in a graphics mode and bypass this hardware limitation entirely. However the system of referring to character encodings by a code page number remains applicable, as an efficient alternative to string identifiers such as those specified by the IETF and IANA for use in various protocols such as e-mail and web pages.
Relationship to ASCII
The vast majority of code pages in current use are supersets of ASCII, a 7-bit code representing 128 control codes and printable characters. In the distant past, 8-bit implementations of the ASCII code set the top bit to zero or used it as a parity bit in network data transmissions. When the top bit was made available for representing character data, a total of 256 characters and control codes could be represented. Most vendors (including IBM) used this extended range to encode characters used by various languages and graphical elements that allowed the imitation of primitive graphics on text-only output devices. No formal standard existed for these ‘extended character sets’ and vendors referred to the variants as code pages, as IBM had always done for variants of EBCDIC encodings.
Relationship to Unicode
Unicode is an effort to include all characters from previous code pages into a single character enumeration that can be used with a number of encoding schemes. In the process, duplicate characters are eliminated and new variants are introduced, like fullwidth ASCII. While consistent use of any single Unicode encoding would theoretically eliminate the need to keep track of different code pages or character encodings, the existence of multiple encodings of Unicode as well as the need to remain compatible with existing documents and systems that use the older encodings remains. In practice the various Unicode character set encodings have simply been assigned their own code page numbers, and all the other code pages have been technically redefined as encodings for various subsets of Unicode.
Noteworthy code pages
IBM PC (OEM) code pages
These code pages were originally embedded directly in the text mode hardware of the graphic adapters used with the IBM PC and its clones, including the original MDA and CGA adapters whose character sets could only be changed by physically replacing a ROM chip that contained the font. The interface of those adapters (emulated by all later adapters such as VGA) was typically limited to single byte character sets with only 256 characters in each font/encoding (although VGA added partial support for slightly larger character sets). Since the original IBM PC code page (number 437) was not really designed for international use, several partially compatible country or region specific variants emerged. Microsoft refers to these as the OEM code pages because they were defined by the OEM's who licensed MS-DOS for distribution with their hardware, not by Microsoft or a standards organization. Examples include:
- 111 – Greek (Not from IBM; AST Premium Exec DOS 5.0)
- 112 – Turkish (Not from IBM; AST Premium Exec DOS 5.0)
- 113 – Yugoslavian (Not from IBM; AST Premium Exec DOS 5.0)
- 151 – Nafitha Arabic (Not from IBM; ADOS)
- 161 – Arabic (Not from IBM; ADOS)
- 162 – Arabic (Not from IBM; ADOS)
- 163 – Arabic (Not from IBM; ADOS)
- 164 – Arabic (Not from IBM; ADOS)
- 165 – Arabic (Not from IBM; ADOS)
- 220 – Spanish (Not from IBM)
- 437 – Original IBM PC hardware code page
- 667 – Polish (Mazovia) (Not from IBM)
- 668 – Polish (Not from IBM)
- 708 – Arabic (ASMO 708)
- 709 – Arabic (Not from IBM; ASMO 449+/BCON V4)
- 710 – Arabic (Transparent Arabic)
- 711 – Arabic (Not from IBM; Nafitha Enhanced)
- 720 – Arabic (Transparent ASMO)
- 737 – Greek (437G)
- 770 – Estonian, Latvian, Lithuanian
- 771 – Lithuanian/Cyrillic — KBL
- 772 – Lithuanian/Cyrillic
- 773 – Latin-7 — KBL
- 774 – Lithuanian
- 775 – Latin-7
- 776 – Lithuanian (extended CP770)
- 777 – Accented Lithuanian (old) (extended CP771) — KBL
- 778 – Accented Lithuanian (extended CP775)
- 790 – Polish (Mazovia)
- 808 – Cyrillic with euro
- 848 – Ukrainian with euro
- 849 – Belarusian with euro
- 850 – Latin-1
- 851 – Greek
- 852 – Latin-2
- 853 – Latin-3
- 855 – Cyrillic
- 856 – Hebrew
- 857 – Latin-5
- 858 – Latin-1 with euro symbol
- 859 – Latin-9
- 860 – Portuguese
- 861 – Icelandic
- 862 – Hebrew
- 863 – Canadian French
- 864 – Arabic
- 865 – Danish/Norwegian
- 866 – Belarusian, Russian, Ukrainian
- 867 – Czech (Kamenický) (Not from IBM; conflictive ID with IBM CP862 — Hebrew + € (based on CP862))
- 868 – Urdu
- 869 – Greek
- 872 – Cyrillic with euro
- 874 – Thai (conflictive ID with Windows 874; Windows version is IBM 1162)
- 881 – Latin 1 (Not from IBM; AST Premium Exec DOS 5.0) (conflictive ID with IBM EBCDIC 881)
- 882 – Latin 2 (Not from IBM; AST Premium Exec DOS 5.0) (conflictive ID with IBM EBCDIC 882)
- 883 – Latin 3 (Not from IBM; AST Premium Exec DOS 5.0) (conflictive ID with IBM EBCDIC 883)
- 884 – Latin 4 (Not from IBM; AST Premium Exec DOS 5.0) (conflictive ID with IBM EBCDIC 884)
- 885 – Latin 5 (Not from IBM; AST Premium Exec DOS 5.0) (conflictive ID with IBM EBCDIC 885)
- 891 – Korean
- 895 – Czech (Kamenický), (Not from IBM; conflictive ID with IBM CP895 — 7-bit EUC Japanese Roman)
- 900 – Cyrillic (Not from IBM)
- 932 – Japanese (DOS/V) (DBCS) (conflictive ID with Windows 932; Windows version is IBM 943)
- 934 – Korean (DOS/V) (DBCS)
- 936 – ANSI/OEM Simplified Chinese (gb2312) (DOS/V) (DBCS) (conflictive ID with Windows 936; Windows version is IBM 1386)
- 938 – Traditional Chinese (DOS/V, OS/2)
- 942 – Japanese SAA (OS/2)
- 943 – Japanese (Windows CP 932)
- 944 – Korean SAA (OS/2)
- 948 – Traditional Chinese SAA (OS/2)
- 949 – Korean (Unified Hangul / Extended Wansung (ks_c_5601-1987)) (conflictive ID with Windows 949; Windows version is IBM 1363)
- 950 – Traditional Chinese (Big5 encoding)
- 966 – Saudi Arabian (Not from IBM)
- 991 – Polish (Mazovia) (Not from IBM)
- 1098 – Farsi
- 1116 – Estonian
- 1117 – Latvian
- 1118 – Lithuanian
- 1119 – Lithuanian/Cyrillic
- 1125 – Ukrainian
- 1131 – Belarusian
When dealing with older hardware, protocols and file formats, it is often necessary to support these code pages, but newer encoding systems, in particular Unicode, are encouraged for new designs.
Code page 819 is identical to Latin-1, ISO/IEC 8859-1, and with slightly-modified commands, permits MS-DOS machines to use that encoding. It was used with IBM AS/400 minicomputers.
Code pages for DBCS character encodings
- 932 – Supports Japanese
- 936 – GBK Supports Simplified Chinese
- 949 – Supports Korean
- 950 – Supports Traditional Chinese
Microsoft code page numbers for various other character encodings
The following code page numbers are specific to Microsoft Windows. IBM may use different numbers for these code pages.
- 1200 – UTF-16LE Unicode little-endian
- 1201 – UTF-16BE Unicode big-endian
- 10000 - Apple Macintosh Roman
- 10001 - Apple Japanese
- 10002 - Apple Chinese (traditional) (BIG-5)
- 10003 - Apple Korean
- 10004 - Apple Arabic
- 10005 - Apple Hebrew
- 10006 - Apple Greek
- 10007 - Apple Macintosh Cyrillic
- 10008 - Apple Chinese (simplified) (GB 2312)
- 10010 - Apple Romanian
- 10017 - Apple Ukrainian
- 10021 - Apple Thai
- 10029 - Apple Macintosh Central Europe / Roman II
- 10079 - Apple Icelandic
- 10081 - Apple Turkish
- 10082 - Apple Croatian
- 20127 - US-ASCII The classic US 7 bit character set with no char larger than 127
- 28591 – ISO-8859-1
- 28592 – ISO-8859-2
- 28593 – ISO-8859-3
- 28594 – ISO-8859-4
- 28595 – ISO-8859-5
- 28596 and 38596 – ISO-8859-6
- 28597 – ISO-8859-7
- 28598 and 38598 – ISO-8859-8
- 28599 – ISO-8859-9
- 28600 – ISO-8859-10
- 28601 – ISO-8859-11
- (28602 – ISO-8859-12)
- 28603 – ISO-8859-13
- 28604 – ISO-8859-14
- 28605 – ISO-8859-15
- 28606 – ISO-8859-16
- 38596 – ISO-8859-6
- 38598 – ISO-8859-8
- 65000 – UTF-7 Unicode
- 65001 – UTF-8 Unicode
Windows (ANSI) code pages
Microsoft defined a number of code pages known as the ANSI code pages (as the first one, 1252 was based on an apocryphal ANSI draft of what became ISO 8859-1). Code page 1252 is built on ISO 8859-1 but uses the range 0x80-0x9F for extra printable characters rather than the C1 control codes used in ISO-8859-1. Some of the others are based in part on other parts of ISO 8859 but often rearranged to make them closer to 1252.
Microsoft recommends applications use UTF-8 or UCS-2/UTF-16 instead of these code pages.
List of code page assignments
List of known code page assignments (incomplete):
|0||N/A||Reserved||IBM, Microsoft||N/A||3.3+||1.0+||?||?||?||Internal OS use|
|437||CP437, IBM437||PC US||IBM||IBM PC||3.3+||1.0+||Yes||?||Yes||8-bit SBCS|
|57344 - 61439||N/A||Private use derivations||IBM||N/A||N/A||N/A||N/A||N/A||N/A||various||Private use code page derivations (E000h-EFFFh)|
|65280 - 65533||N/A||Private use definitions||IBM||N/A||N/A||N/A||N/A||N/A||N/A||various||Private use code page definitions (FF00h-FFFDh)|
|65534||N/A||Reserved||IBM, Microsoft||N/A||?||?||?||?||?||various||Internal OS use (FFFEh)|
|65535||N/A||Reserved||IBM, Microsoft||N/A||3.3+||1.0+||?||?||?||various||Internal OS use (FFFFh)|
Many older character encodings (unlike Unicode) suffer from several problems.
- Some code page vendors insufficiently document the meaning of all code point values. This decreases the reliability of handling textual data through various computer systems consistently.
- Some vendors add proprietary extensions to some code pages to add or change certain code point values. For example, byte \x5C in Shift JIS can represent either a back slash or a yen currency symbol depending on the platform.
- In order to support several languages in a program that does not use Unicode, the code page used for each string/document needs to be stored.
Due to Unicode's extensive documentation, vast repertoire of characters and stability policy of characters, these problems are rarely a concern for Unicode.
Applications may also mislabel text in Windows-1252 as ISO-8859-1. Fortunately, the only difference between these code pages is that the code point values used by ISO-8859-1 for control characters are instead used as additional printable characters in Windows-1252. Since control characters have no function in HTML, web browsers tend to use Windows-1252 rather than ISO-8859-1.
Private code pages
When, early in the history of personal computers, users didn't find their character encoding requirements met, private or local code pages were created using Terminate and Stay Resident utilities or by re-programming BIOS EPROMs. In some cases, unofficial code page numbers were invented (e.g., CP895).
When more diverse character set support became available most of those code pages fell into disuse, with some exceptions such as the Kamenický or KEYBCS2 encoding for the Czech and Slovak alphabets. Another character set is Iran System encoding standard that was created by Iran System corporation for Persian language support. This standard was in use in Iran in DOS-based programs and after introduction of Microsoft code page 1256 this standard became obsolete. However some Windows and DOS programs using this encoding are still in use and some Windows fonts with this encoding exist.
In order to overcome such problems, the IBM Character Data Representation Architecture level 2 specifically reserves ranges of code page IDs for user-definable and private-use assignments. Whenever such code page IDs are used, the user must not assume that the same functionality and appearance can be reproduced in another system configuration or on another device or system unless the user takes care of this specifically. The code page range 57344-61439 (E000h-EFFFh) is officially reserved for user-definable code pages (or actually CCSIDs in the context of IBM CDRA), whereas the range 65280-65533 (FF00h-FFFDh) is reserved for any user-definable "private use" assignments. For example, a non-registered custom variant of code page 437 (1B5h) or 28591 (6FAF) could become 57781 (E1B5h) or 61359 (EFAFh), respectively, in order to avoid potential conflicts with other assignments and maintain the sometimes existing internal numerical logic in the assignments of the original code pages. An unregistered private code page not based on an existing code page, a device specific code page like a printer font, which just needs a logical handle to become addressable for the system, a frequently changing download font, or a code page number with a symbolic meaning in the local environment could have an assignment in the private range like 65280 (FF00h).
The code page IDs 0, 65534 (FFFEh), 65535 (FFFFh) are reserved for internal use by operating systems such as DOS and must not be assigned to any specific code pages.
- Windows code page
- Character encoding
- CCSID IBM's official "code page" definitions and assignments
- Codepage sniffing
- IBM i Globalization - EBCDIC Code Pages
- SAP ABAP glossary
- Oracle Hyperion glossary
- The MS-DOS Encyclopaedia, Microsoft press (1988, ISBN 1-55615-049-0, ISBN 978-1-55615-049-4)
- Oracle Hyperion glossary
- Page Identifiers (Windows)
- MSDN reference for code pages
- IBM. "SBCS code page information document - CPGID 00437". Retrieved 2014-07-04.
- IBM CDRA glossary
- IBM code pages
- IBM code pages by encoding scheme
- IBM/ICU Charset Information
- Microsoft Code Page Identifiers (Microsoft's list contains only code pages actively used by normal apps on Windows. See also Torsten Mohrin's list for the full list of supported code pages)
- Shorter Microsoft list containing only the ANSI and OEM code pages but with links to more detail on each
- Character Sets And Code Pages At The Push Of A Button
- Microsoft Chcp command: Display and set the console active code page