{"id":7301,"date":"2025-12-20T00:01:02","date_gmt":"2025-12-20T08:01:02","guid":{"rendered":"https:\/\/c-for-dummies.com\/blog\/?p=7301"},"modified":"2025-12-27T09:19:06","modified_gmt":"2025-12-27T17:19:06","slug":"code-page-437","status":"publish","type":"post","link":"https:\/\/c-for-dummies.com\/blog\/?p=7301","title":{"rendered":"Code Page 437"},"content":{"rendered":"<p>The one common denominator in the microcomputer era was ASCII. These 128 codes (zero through 127) provided a modicum of consistency for text files shared between the abundant computer platforms from days of yore. But a byte (<em>char<\/em>) holds 256 values. So what was done about those non-ASCII character codes, 128 through 255?<br \/>\n<!--more--><br \/>\nNever mind that in the early 1980s storage media was incompatible between platforms! You couldn&#8217;t take a diskette from an IBM PC and use it on an Apple II or TRS-80. Should you get the file to another computer, those 128 ASCII characters were read as-is. The rest of the codes, however, were assigned different characters, or character attributes (such as inverse text), on each system.<\/p>\n<p>On the IBM PC, character codes from 128 through 255 were originally called &#8220;extended&#8221; ASCII. These characters were non-standard, but widely used thanks to the popularity of the IBM PC and its various PC clones. The extended ASCII character set is shown in Figure 1.<\/p>\n<div id=\"attachment_7302\" style=\"width: 539px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-7302\" src=\"https:\/\/c-for-dummies.com\/blog\/wp-content\/uploads\/2025\/12\/1220-figure1.png\" alt=\"Extended ASCII characters\" width=\"529\" height=\"272\" class=\"size-full wp-image-7302\" srcset=\"https:\/\/c-for-dummies.com\/blog\/wp-content\/uploads\/2025\/12\/1220-figure1.png 529w, https:\/\/c-for-dummies.com\/blog\/wp-content\/uploads\/2025\/12\/1220-figure1-300x154.png 300w, https:\/\/c-for-dummies.com\/blog\/wp-content\/uploads\/2025\/12\/1220-figure1-500x257.png 500w\" sizes=\"auto, (max-width: 529px) 100vw, 529px\" \/><p id=\"caption-attachment-7302\" class=\"wp-caption-text\">Figure 1. The original IBM PC &#8220;extended&#8221; ASCII characters, also known as Code Page 437.<\/p><\/div>\n<p>Eventually, it was recognized that the 128 extended ASCII characters weren&#8217;t enough. To add more characters, the code page concept was developed. This technology provided a set of 128 characters assigned to code values 128 through 255. The original extended ASCII character set became known as <a href=\"https:\/\/en.wikipedia.org\/wiki\/Code_page_437\" target=\"_blank\">code page 437<\/a>.<\/p>\n<p>When the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Unicode\" target=\"_blank\">Unicode standard<\/a> was developed, the contents of code page 437 were mapped to various Unicode values. The mapping isn&#8217;t consecutive, unlike other Unicode character sets, but the original code page 437 characters are there. In fact, I coded a program to output these characters, which is used in Figure 1. The array of code page 437 Unicode values also appears in the following code, which outputs these values with their hexadecimal and decimal value equivalents.<\/p>\n<h3><a href=\"https:\/\/github.com\/dangookin\/C-For-Dummies-Blog\/blob\/master\/2025_12_20-Lesson.c\" rel=\"noopener\" target=\"_blank\">2025_12_20-Lesson.c<\/a><\/h3>\n<pre class=\"screen\">\r\n#include &lt;locale.h&gt;\r\n#include &lt;wchar.h&gt;\r\n\r\n#define GREEN \"\\e[32m\"\r\n#define NORMAL \"\\e[m\"\r\n\r\nint main()\r\n{\r\n    wchar_t extended_ASCII[] = {\r\n        0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0,\r\n        0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF,\r\n        0x00EE, 0x00EC, 0x00C4, 0x00C5, 0x00C9, 0x00E6,\r\n        0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9,\r\n        0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5,\r\n        0x20A7, 0x0192, 0x00E1, 0x00ED, 0x00F3, 0x00FA,\r\n        0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310,\r\n        0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,\r\n        0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561,\r\n        0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557,\r\n        0x255D, 0x255C, 0x255B, 0x2510, 0x2514, 0x2534,\r\n        0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F,\r\n        0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550,\r\n        0x256C, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559,\r\n        0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518,\r\n        0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\r\n        0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3,\r\n        0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4,\r\n        0x221E, 0x03C6, 0x03B5, 0x2229, 0x2261, 0x00B1,\r\n        0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248,\r\n        0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2,\r\n        0x25A0, 0x00A0\r\n    };\r\n    int x;\r\n\r\n    <span class=\"comments\">\/* set the locale for wide characters *\/<\/span>\r\n    setlocale(LC_ALL,\"\");\r\n\r\n    for( x=0; x&lt;=127; x++ )\r\n        wprintf(L\"%02X %03d %s%lc%s\\n\",\r\n                x+128,\r\n                x+128,\r\n                GREEN,\r\n                extended_ASCII[x],\r\n                NORMAL\r\n               );\r\n    return 0;\r\n}<\/pre>\n<p>The <code>extended_ASCII[]<\/code> array is composed of <em>wchar_t<\/em> data types, wide characters. The values correspond to code page 437 character codes 128 through 255. You see that the array&#8217;s values aren&#8217;t sequential, but they accurately represent the original characters.<\/p>\n<p>A <em>for<\/em> loop outputs all 128 values. The <em>wprintf()<\/em> statement uses the <code>L<\/code> prefix to make its formatting string wide; the <code>%lc<\/code> placeholder represents a <em>wchar_t<\/em> value. The <code>GREEN<\/code> and <code>NORMAL<\/code> defined constants represent ANSI color codes, so that the extended ASCII characters are output in green text. Here&#8217;s a truncated sample run:<\/p>\n<p><code>80 128 <span style=\"color:green\">\u00c7<\/span><br \/>\n81 129 <span style=\"color:green\">\u00fc<\/span><br \/>\n82 130 <span style=\"color:green\">\u00e9<\/span><br \/>\n83 131 <span style=\"color:green\">\u00e2<\/span><br \/>\n84 132 <span style=\"color:green\">\u00e4<\/span><br \/>\n85 133 <span style=\"color:green\">\u00e0<\/span><br \/>\n86 134 <span style=\"color:green\">\u00e5<\/span><br \/>\n87 135 <span style=\"color:green\">\u00e7<\/span><br \/>\n...<br \/>\nF8 248 <span style=\"color:green\">\u00b0<\/span><br \/>\nF9 249 <span style=\"color:green\">\u2219<\/span><br \/>\nFA 250 <span style=\"color:green\">\u00b7<\/span><br \/>\nFB 251 <span style=\"color:green\">\u221a<\/span><br \/>\nFC 252 <span style=\"color:green\">\u207f<\/span><br \/>\nFD 253 <span style=\"color:green\">\u00b2<\/span><br \/>\nFE 254 <span style=\"color:green\">\u25a0<\/span><br \/>\nFF 255 <span style=\"color:green\">\u00a0<\/span><\/code><\/p>\n<p>You might be curious about character 255. It&#8217;s a &#8220;blank.&#8221; This character isn&#8217;t a space; it&#8217;s Unicode U-00A0. It&#8217;s different from the space character (U-0020) but it appears the same.<\/p>\n<p>For <a href=\"https:\/\/c-for-dummies.com\/blog\/?p=7312\">next week&#8217;s Lesson<\/a>, I combine these characters with the wide characters for the ASCII control codes to finally update my own colorful version of the <em>hexdump<\/em> utility.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The myth of &#8220;extended&#8221; ASCII. <a href=\"https:\/\/c-for-dummies.com\/blog\/?p=7301\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-7301","post","type-post","status-publish","format-standard","hentry","category-main"],"_links":{"self":[{"href":"https:\/\/c-for-dummies.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/7301","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/c-for-dummies.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/c-for-dummies.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/c-for-dummies.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/c-for-dummies.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7301"}],"version-history":[{"count":5,"href":"https:\/\/c-for-dummies.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/7301\/revisions"}],"predecessor-version":[{"id":7336,"href":"https:\/\/c-for-dummies.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/7301\/revisions\/7336"}],"wp:attachment":[{"href":"https:\/\/c-for-dummies.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7301"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/c-for-dummies.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7301"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/c-for-dummies.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7301"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}