diff --git a/README.md b/README.md index 4ec08cf..ee6cf1b 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ # msdos-encodings -Bidirectional, emulator-grade conversion between MS-DOS code pages and Unicode — -without linking ICU. The crate owns the canonical Microsoft tables, so it stays -small, self-contained, and cross-compiles cleanly. +Bidirectional, emulator-grade conversion between Microsoft code pages and +Unicode — without linking ICU. The crate owns the canonical Microsoft tables, +so it stays small, self-contained, and cross-compiles cleanly. These are strictly **Microsoft's** mappings as published by the Unicode -Consortium (`VENDORS/MICSFT/PC/`) — not the IBM or Oracle variants, which +Consortium (`VENDORS/MICSFT/`) — not the IBM or Oracle variants, which differ in a handful of slots. ```rust -use msdos_encodings::DosEncoding; +use msdos_encodings::{DosEncoding, Encoding, WindowsEncoding}; let enc = DosEncoding::default(); // code page 437 assert_eq!(enc.decode(b"Caf\x82").unwrap(), "Café"); @@ -19,26 +19,36 @@ assert_eq!(enc.encode("Café").unwrap(), b"Caf\x82"); let enc = DosEncoding::from_code_page(866).unwrap(); assert_eq!(enc.decode(&[0x80]).unwrap(), "А"); // DOS Cyrillic Russian -// Four pages leave bytes undefined; decode is fallible, or go lossy: +// The Windows ANSI family is a separate enum: +let enc = WindowsEncoding::Cp1252; +assert_eq!(enc.decode(&[0x93, 0x80, 0x94]).unwrap(), "\u{201C}€\u{201D}"); + +// Or resolve a raw code page number across both families: +assert_eq!(Encoding::from_code_page(1251).unwrap().name(), "Windows Cyrillic"); + +// Some pages leave bytes undefined; decode is fallible, or go lossy: assert!(DosEncoding::Cp874.decode(&[0xFF]).is_err()); assert_eq!(DosEncoding::Cp874.decode_lossy(&[0xFF]), "\u{FFFD}"); ``` ## Status -- **All sixteen single-byte DOS pages** — implemented, decode + encode: +- **All sixteen single-byte DOS (OEM) pages** — implemented, decode + encode: 437, 737, 775, 850, 852, 855, 857, 860, 861, 862, 863, 864, 865, 866, 869, 874. - **All four double-byte CJK pages** — implemented, decode + encode: 932 (Shift-JIS), 936 (GBK), 949 (Unified Hangul), 950 (Big5). They sit behind the on-by-default `dbcs` feature; build with `default-features = false` for a lean single-byte-only crate. +- **All ten single-byte Windows ANSI pages** — implemented, decode + encode: + 874 (Thai) and 1250–1258, as `WindowsEncoding`. ## Fidelity notes - Every single-byte table is a verified bijection: anything a page decodes re-encodes to the identical bytes. -- Code pages 857, 864, 869, and 874 leave some byte values undefined, so - `decode` returns a `Result`; `decode_lossy` substitutes U+FFFD. +- Many pages leave byte values undefined (DOS 857/864/869/874; every ANSI + page except 1256 has holes in `0x80..=0x9F`), so `decode` returns a + `Result`; `decode_lossy` substitutes U+FFFD. - Microsoft's CP864 (DOS Arabic) maps `0x25` to ARABIC PERCENT SIGN — the low half is *not* pure ASCII, and `%` itself is unmappable. This is faithful to the source table. @@ -46,20 +56,23 @@ assert_eq!(DosEncoding::Cp874.decode_lossy(&[0xFF]), "\u{FFFD}"); character (932's NEC/IBM extension overlap, 950's duplicated box-drawing rows). All of them decode; re-encoding picks the code Windows picks, as resolved from Microsoft's own `bestfit932/950.txt` WCTABLE (vendored in - `data/`, used *only* for duplicate resolution — no lossy best-fit mappings - are imported). + `data/bestfit/`, used *only* for duplicate resolution — no lossy best-fit + mappings are imported). - Double-byte decode adds two failure modes: a lead byte at end of input (`TruncatedPair`) and an undefined lead/trail pair (`UndefinedPair`). `decode_lossy` emits one U+FFFD per failed pair. - The full decode direction of all four CJK pages agrees exactly with Python's `cp932`/`cp936`/`cp949`/`cp950` codecs (59k+ pairs, verified during development). +- Microsoft publishes the identical Thai table for both families, so + `DosEncoding::Cp874` and `WindowsEncoding::Cp874` agree byte-for-byte + (pinned by a test). ## Regenerating tables Everything in `src/tables/` except `mod.rs` is generated from the vendored -mapping files in `data/` -(needs Python ≥ 3.10 and `rustfmt` on `PATH`): +mapping files in `data/` (`pc/` and `windows/` mapping tables, `bestfit/` +for duplicate resolution; needs Python ≥ 3.10 and `rustfmt` on `PATH`): ```sh uv run tools/gen_tables.py @@ -69,7 +82,8 @@ uv run tools/gen_tables.py Text-encoding conversion only. Filename conventions (8.3 space padding, case folding, the 0x05/0xE5 deleted-entry dance) are deliberately **out of -scope** and left to consumers. +scope** and left to consumers, as is any Vietnamese (CP1258) combining-mark +normalization. ## Consumers diff --git a/data/bestfit932.txt b/data/bestfit/bestfit932.txt similarity index 100% rename from data/bestfit932.txt rename to data/bestfit/bestfit932.txt diff --git a/data/bestfit936.txt b/data/bestfit/bestfit936.txt similarity index 100% rename from data/bestfit936.txt rename to data/bestfit/bestfit936.txt diff --git a/data/bestfit949.txt b/data/bestfit/bestfit949.txt similarity index 100% rename from data/bestfit949.txt rename to data/bestfit/bestfit949.txt diff --git a/data/bestfit950.txt b/data/bestfit/bestfit950.txt similarity index 100% rename from data/bestfit950.txt rename to data/bestfit/bestfit950.txt diff --git a/data/CP437.TXT b/data/pc/CP437.TXT similarity index 100% rename from data/CP437.TXT rename to data/pc/CP437.TXT diff --git a/data/CP737.TXT b/data/pc/CP737.TXT similarity index 100% rename from data/CP737.TXT rename to data/pc/CP737.TXT diff --git a/data/CP775.TXT b/data/pc/CP775.TXT similarity index 100% rename from data/CP775.TXT rename to data/pc/CP775.TXT diff --git a/data/CP850.TXT b/data/pc/CP850.TXT similarity index 100% rename from data/CP850.TXT rename to data/pc/CP850.TXT diff --git a/data/CP852.TXT b/data/pc/CP852.TXT similarity index 100% rename from data/CP852.TXT rename to data/pc/CP852.TXT diff --git a/data/CP855.TXT b/data/pc/CP855.TXT similarity index 100% rename from data/CP855.TXT rename to data/pc/CP855.TXT diff --git a/data/CP857.TXT b/data/pc/CP857.TXT similarity index 100% rename from data/CP857.TXT rename to data/pc/CP857.TXT diff --git a/data/CP860.TXT b/data/pc/CP860.TXT similarity index 100% rename from data/CP860.TXT rename to data/pc/CP860.TXT diff --git a/data/CP861.TXT b/data/pc/CP861.TXT similarity index 100% rename from data/CP861.TXT rename to data/pc/CP861.TXT diff --git a/data/CP862.TXT b/data/pc/CP862.TXT similarity index 100% rename from data/CP862.TXT rename to data/pc/CP862.TXT diff --git a/data/CP863.TXT b/data/pc/CP863.TXT similarity index 100% rename from data/CP863.TXT rename to data/pc/CP863.TXT diff --git a/data/CP864.TXT b/data/pc/CP864.TXT similarity index 100% rename from data/CP864.TXT rename to data/pc/CP864.TXT diff --git a/data/CP865.TXT b/data/pc/CP865.TXT similarity index 100% rename from data/CP865.TXT rename to data/pc/CP865.TXT diff --git a/data/CP866.TXT b/data/pc/CP866.TXT similarity index 100% rename from data/CP866.TXT rename to data/pc/CP866.TXT diff --git a/data/CP869.TXT b/data/pc/CP869.TXT similarity index 100% rename from data/CP869.TXT rename to data/pc/CP869.TXT diff --git a/data/CP874.TXT b/data/pc/CP874.TXT similarity index 100% rename from data/CP874.TXT rename to data/pc/CP874.TXT diff --git a/data/windows/CP1250.TXT b/data/windows/CP1250.TXT new file mode 100644 index 0000000..6bfab93 --- /dev/null +++ b/data/windows/CP1250.TXT @@ -0,0 +1,274 @@ +# +# Name: cp1250 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: Shawn.Steele@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1250 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1250 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 #UNDEFINED +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 #UNDEFINED +0x89 0x2030 #PER MILLE SIGN +0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x015A #LATIN CAPITAL LETTER S WITH ACUTE +0x8D 0x0164 #LATIN CAPITAL LETTER T WITH CARON +0x8E 0x017D #LATIN CAPITAL LETTER Z WITH CARON +0x8F 0x0179 #LATIN CAPITAL LETTER Z WITH ACUTE +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 #UNDEFINED +0x99 0x2122 #TRADE MARK SIGN +0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x015B #LATIN SMALL LETTER S WITH ACUTE +0x9D 0x0165 #LATIN SMALL LETTER T WITH CARON +0x9E 0x017E #LATIN SMALL LETTER Z WITH CARON +0x9F 0x017A #LATIN SMALL LETTER Z WITH ACUTE +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x02C7 #CARON +0xA2 0x02D8 #BREVE +0xA3 0x0141 #LATIN CAPITAL LETTER L WITH STROKE +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x0104 #LATIN CAPITAL LETTER A WITH OGONEK +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x015E #LATIN CAPITAL LETTER S WITH CEDILLA +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x017B #LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x02DB #OGONEK +0xB3 0x0142 #LATIN SMALL LETTER L WITH STROKE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x0105 #LATIN SMALL LETTER A WITH OGONEK +0xBA 0x015F #LATIN SMALL LETTER S WITH CEDILLA +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x013D #LATIN CAPITAL LETTER L WITH CARON +0xBD 0x02DD #DOUBLE ACUTE ACCENT +0xBE 0x013E #LATIN SMALL LETTER L WITH CARON +0xBF 0x017C #LATIN SMALL LETTER Z WITH DOT ABOVE +0xC0 0x0154 #LATIN CAPITAL LETTER R WITH ACUTE +0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x0102 #LATIN CAPITAL LETTER A WITH BREVE +0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x0139 #LATIN CAPITAL LETTER L WITH ACUTE +0xC6 0x0106 #LATIN CAPITAL LETTER C WITH ACUTE +0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x010C #LATIN CAPITAL LETTER C WITH CARON +0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x0118 #LATIN CAPITAL LETTER E WITH OGONEK +0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x011A #LATIN CAPITAL LETTER E WITH CARON +0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x010E #LATIN CAPITAL LETTER D WITH CARON +0xD0 0x0110 #LATIN CAPITAL LETTER D WITH STROKE +0xD1 0x0143 #LATIN CAPITAL LETTER N WITH ACUTE +0xD2 0x0147 #LATIN CAPITAL LETTER N WITH CARON +0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x0150 #LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x0158 #LATIN CAPITAL LETTER R WITH CARON +0xD9 0x016E #LATIN CAPITAL LETTER U WITH RING ABOVE +0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x0170 #LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x00DD #LATIN CAPITAL LETTER Y WITH ACUTE +0xDE 0x0162 #LATIN CAPITAL LETTER T WITH CEDILLA +0xDF 0x00DF #LATIN SMALL LETTER SHARP S +0xE0 0x0155 #LATIN SMALL LETTER R WITH ACUTE +0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x0103 #LATIN SMALL LETTER A WITH BREVE +0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x013A #LATIN SMALL LETTER L WITH ACUTE +0xE6 0x0107 #LATIN SMALL LETTER C WITH ACUTE +0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x010D #LATIN SMALL LETTER C WITH CARON +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x0119 #LATIN SMALL LETTER E WITH OGONEK +0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x011B #LATIN SMALL LETTER E WITH CARON +0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x010F #LATIN SMALL LETTER D WITH CARON +0xF0 0x0111 #LATIN SMALL LETTER D WITH STROKE +0xF1 0x0144 #LATIN SMALL LETTER N WITH ACUTE +0xF2 0x0148 #LATIN SMALL LETTER N WITH CARON +0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x0151 #LATIN SMALL LETTER O WITH DOUBLE ACUTE +0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x0159 #LATIN SMALL LETTER R WITH CARON +0xF9 0x016F #LATIN SMALL LETTER U WITH RING ABOVE +0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE +0xFB 0x0171 #LATIN SMALL LETTER U WITH DOUBLE ACUTE +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x00FD #LATIN SMALL LETTER Y WITH ACUTE +0xFE 0x0163 #LATIN SMALL LETTER T WITH CEDILLA +0xFF 0x02D9 #DOT ABOVE diff --git a/data/windows/CP1251.TXT b/data/windows/CP1251.TXT new file mode 100644 index 0000000..4d9b355 --- /dev/null +++ b/data/windows/CP1251.TXT @@ -0,0 +1,274 @@ +# +# Name: cp1251 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: Shawn.Steele@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1251 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1251 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x0402 #CYRILLIC CAPITAL LETTER DJE +0x81 0x0403 #CYRILLIC CAPITAL LETTER GJE +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0453 #CYRILLIC SMALL LETTER GJE +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x20AC #EURO SIGN +0x89 0x2030 #PER MILLE SIGN +0x8A 0x0409 #CYRILLIC CAPITAL LETTER LJE +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x040A #CYRILLIC CAPITAL LETTER NJE +0x8D 0x040C #CYRILLIC CAPITAL LETTER KJE +0x8E 0x040B #CYRILLIC CAPITAL LETTER TSHE +0x8F 0x040F #CYRILLIC CAPITAL LETTER DZHE +0x90 0x0452 #CYRILLIC SMALL LETTER DJE +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 #UNDEFINED +0x99 0x2122 #TRADE MARK SIGN +0x9A 0x0459 #CYRILLIC SMALL LETTER LJE +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x045A #CYRILLIC SMALL LETTER NJE +0x9D 0x045C #CYRILLIC SMALL LETTER KJE +0x9E 0x045B #CYRILLIC SMALL LETTER TSHE +0x9F 0x045F #CYRILLIC SMALL LETTER DZHE +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x040E #CYRILLIC CAPITAL LETTER SHORT U +0xA2 0x045E #CYRILLIC SMALL LETTER SHORT U +0xA3 0x0408 #CYRILLIC CAPITAL LETTER JE +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x0490 #CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x0401 #CYRILLIC CAPITAL LETTER IO +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x0404 #CYRILLIC CAPITAL LETTER UKRAINIAN IE +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x0407 #CYRILLIC CAPITAL LETTER YI +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x0406 #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0xB3 0x0456 #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0xB4 0x0491 #CYRILLIC SMALL LETTER GHE WITH UPTURN +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x0451 #CYRILLIC SMALL LETTER IO +0xB9 0x2116 #NUMERO SIGN +0xBA 0x0454 #CYRILLIC SMALL LETTER UKRAINIAN IE +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x0458 #CYRILLIC SMALL LETTER JE +0xBD 0x0405 #CYRILLIC CAPITAL LETTER DZE +0xBE 0x0455 #CYRILLIC SMALL LETTER DZE +0xBF 0x0457 #CYRILLIC SMALL LETTER YI +0xC0 0x0410 #CYRILLIC CAPITAL LETTER A +0xC1 0x0411 #CYRILLIC CAPITAL LETTER BE +0xC2 0x0412 #CYRILLIC CAPITAL LETTER VE +0xC3 0x0413 #CYRILLIC CAPITAL LETTER GHE +0xC4 0x0414 #CYRILLIC CAPITAL LETTER DE +0xC5 0x0415 #CYRILLIC CAPITAL LETTER IE +0xC6 0x0416 #CYRILLIC CAPITAL LETTER ZHE +0xC7 0x0417 #CYRILLIC CAPITAL LETTER ZE +0xC8 0x0418 #CYRILLIC CAPITAL LETTER I +0xC9 0x0419 #CYRILLIC CAPITAL LETTER SHORT I +0xCA 0x041A #CYRILLIC CAPITAL LETTER KA +0xCB 0x041B #CYRILLIC CAPITAL LETTER EL +0xCC 0x041C #CYRILLIC CAPITAL LETTER EM +0xCD 0x041D #CYRILLIC CAPITAL LETTER EN +0xCE 0x041E #CYRILLIC CAPITAL LETTER O +0xCF 0x041F #CYRILLIC CAPITAL LETTER PE +0xD0 0x0420 #CYRILLIC CAPITAL LETTER ER +0xD1 0x0421 #CYRILLIC CAPITAL LETTER ES +0xD2 0x0422 #CYRILLIC CAPITAL LETTER TE +0xD3 0x0423 #CYRILLIC CAPITAL LETTER U +0xD4 0x0424 #CYRILLIC CAPITAL LETTER EF +0xD5 0x0425 #CYRILLIC CAPITAL LETTER HA +0xD6 0x0426 #CYRILLIC CAPITAL LETTER TSE +0xD7 0x0427 #CYRILLIC CAPITAL LETTER CHE +0xD8 0x0428 #CYRILLIC CAPITAL LETTER SHA +0xD9 0x0429 #CYRILLIC CAPITAL LETTER SHCHA +0xDA 0x042A #CYRILLIC CAPITAL LETTER HARD SIGN +0xDB 0x042B #CYRILLIC CAPITAL LETTER YERU +0xDC 0x042C #CYRILLIC CAPITAL LETTER SOFT SIGN +0xDD 0x042D #CYRILLIC CAPITAL LETTER E +0xDE 0x042E #CYRILLIC CAPITAL LETTER YU +0xDF 0x042F #CYRILLIC CAPITAL LETTER YA +0xE0 0x0430 #CYRILLIC SMALL LETTER A +0xE1 0x0431 #CYRILLIC SMALL LETTER BE +0xE2 0x0432 #CYRILLIC SMALL LETTER VE +0xE3 0x0433 #CYRILLIC SMALL LETTER GHE +0xE4 0x0434 #CYRILLIC SMALL LETTER DE +0xE5 0x0435 #CYRILLIC SMALL LETTER IE +0xE6 0x0436 #CYRILLIC SMALL LETTER ZHE +0xE7 0x0437 #CYRILLIC SMALL LETTER ZE +0xE8 0x0438 #CYRILLIC SMALL LETTER I +0xE9 0x0439 #CYRILLIC SMALL LETTER SHORT I +0xEA 0x043A #CYRILLIC SMALL LETTER KA +0xEB 0x043B #CYRILLIC SMALL LETTER EL +0xEC 0x043C #CYRILLIC SMALL LETTER EM +0xED 0x043D #CYRILLIC SMALL LETTER EN +0xEE 0x043E #CYRILLIC SMALL LETTER O +0xEF 0x043F #CYRILLIC SMALL LETTER PE +0xF0 0x0440 #CYRILLIC SMALL LETTER ER +0xF1 0x0441 #CYRILLIC SMALL LETTER ES +0xF2 0x0442 #CYRILLIC SMALL LETTER TE +0xF3 0x0443 #CYRILLIC SMALL LETTER U +0xF4 0x0444 #CYRILLIC SMALL LETTER EF +0xF5 0x0445 #CYRILLIC SMALL LETTER HA +0xF6 0x0446 #CYRILLIC SMALL LETTER TSE +0xF7 0x0447 #CYRILLIC SMALL LETTER CHE +0xF8 0x0448 #CYRILLIC SMALL LETTER SHA +0xF9 0x0449 #CYRILLIC SMALL LETTER SHCHA +0xFA 0x044A #CYRILLIC SMALL LETTER HARD SIGN +0xFB 0x044B #CYRILLIC SMALL LETTER YERU +0xFC 0x044C #CYRILLIC SMALL LETTER SOFT SIGN +0xFD 0x044D #CYRILLIC SMALL LETTER E +0xFE 0x044E #CYRILLIC SMALL LETTER YU +0xFF 0x044F #CYRILLIC SMALL LETTER YA diff --git a/data/windows/CP1252.TXT b/data/windows/CP1252.TXT new file mode 100644 index 0000000..8ff4b20 --- /dev/null +++ b/data/windows/CP1252.TXT @@ -0,0 +1,274 @@ +# +# Name: cp1252 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: Shawn.Steele@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1252 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1252 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT +0x89 0x2030 #PER MILLE SIGN +0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x0152 #LATIN CAPITAL LIGATURE OE +0x8D #UNDEFINED +0x8E 0x017D #LATIN CAPITAL LETTER Z WITH CARON +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 0x02DC #SMALL TILDE +0x99 0x2122 #TRADE MARK SIGN +0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x0153 #LATIN SMALL LIGATURE OE +0x9D #UNDEFINED +0x9E 0x017E #LATIN SMALL LETTER Z WITH CARON +0x9F 0x0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x00A1 #INVERTED EXCLAMATION MARK +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x00AA #FEMININE ORDINAL INDICATOR +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00AF #MACRON +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x00BA #MASCULINE ORDINAL INDICATOR +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x00BF #INVERTED QUESTION MARK +0xC0 0x00C0 #LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 #LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 #LATIN CAPITAL LETTER AE +0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 #LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC #LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF #LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x00D0 #LATIN CAPITAL LETTER ETH +0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 #LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 #LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 #LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x00DD #LATIN CAPITAL LETTER Y WITH ACUTE +0xDE 0x00DE #LATIN CAPITAL LETTER THORN +0xDF 0x00DF #LATIN SMALL LETTER SHARP S +0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 #LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 #LATIN SMALL LETTER AE +0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC #LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x00F0 #LATIN SMALL LETTER ETH +0xF1 0x00F1 #LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 #LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 #LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x00F8 #LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x00FD #LATIN SMALL LETTER Y WITH ACUTE +0xFE 0x00FE #LATIN SMALL LETTER THORN +0xFF 0x00FF #LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/data/windows/CP1253.TXT b/data/windows/CP1253.TXT new file mode 100644 index 0000000..20a55b0 --- /dev/null +++ b/data/windows/CP1253.TXT @@ -0,0 +1,274 @@ +# +# Name: cp1253 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: Shawn.Steele@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1253 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1253 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 #UNDEFINED +0x89 0x2030 #PER MILLE SIGN +0x8A #UNDEFINED +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C #UNDEFINED +0x8D #UNDEFINED +0x8E #UNDEFINED +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 #UNDEFINED +0x99 0x2122 #TRADE MARK SIGN +0x9A #UNDEFINED +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C #UNDEFINED +0x9D #UNDEFINED +0x9E #UNDEFINED +0x9F #UNDEFINED +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x0385 #GREEK DIALYTIKA TONOS +0xA2 0x0386 #GREEK CAPITAL LETTER ALPHA WITH TONOS +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA #UNDEFINED +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x2015 #HORIZONTAL BAR +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x0384 #GREEK TONOS +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x0388 #GREEK CAPITAL LETTER EPSILON WITH TONOS +0xB9 0x0389 #GREEK CAPITAL LETTER ETA WITH TONOS +0xBA 0x038A #GREEK CAPITAL LETTER IOTA WITH TONOS +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x038C #GREEK CAPITAL LETTER OMICRON WITH TONOS +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x038E #GREEK CAPITAL LETTER UPSILON WITH TONOS +0xBF 0x038F #GREEK CAPITAL LETTER OMEGA WITH TONOS +0xC0 0x0390 #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0xC1 0x0391 #GREEK CAPITAL LETTER ALPHA +0xC2 0x0392 #GREEK CAPITAL LETTER BETA +0xC3 0x0393 #GREEK CAPITAL LETTER GAMMA +0xC4 0x0394 #GREEK CAPITAL LETTER DELTA +0xC5 0x0395 #GREEK CAPITAL LETTER EPSILON +0xC6 0x0396 #GREEK CAPITAL LETTER ZETA +0xC7 0x0397 #GREEK CAPITAL LETTER ETA +0xC8 0x0398 #GREEK CAPITAL LETTER THETA +0xC9 0x0399 #GREEK CAPITAL LETTER IOTA +0xCA 0x039A #GREEK CAPITAL LETTER KAPPA +0xCB 0x039B #GREEK CAPITAL LETTER LAMDA +0xCC 0x039C #GREEK CAPITAL LETTER MU +0xCD 0x039D #GREEK CAPITAL LETTER NU +0xCE 0x039E #GREEK CAPITAL LETTER XI +0xCF 0x039F #GREEK CAPITAL LETTER OMICRON +0xD0 0x03A0 #GREEK CAPITAL LETTER PI +0xD1 0x03A1 #GREEK CAPITAL LETTER RHO +0xD2 #UNDEFINED +0xD3 0x03A3 #GREEK CAPITAL LETTER SIGMA +0xD4 0x03A4 #GREEK CAPITAL LETTER TAU +0xD5 0x03A5 #GREEK CAPITAL LETTER UPSILON +0xD6 0x03A6 #GREEK CAPITAL LETTER PHI +0xD7 0x03A7 #GREEK CAPITAL LETTER CHI +0xD8 0x03A8 #GREEK CAPITAL LETTER PSI +0xD9 0x03A9 #GREEK CAPITAL LETTER OMEGA +0xDA 0x03AA #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +0xDB 0x03AB #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +0xDC 0x03AC #GREEK SMALL LETTER ALPHA WITH TONOS +0xDD 0x03AD #GREEK SMALL LETTER EPSILON WITH TONOS +0xDE 0x03AE #GREEK SMALL LETTER ETA WITH TONOS +0xDF 0x03AF #GREEK SMALL LETTER IOTA WITH TONOS +0xE0 0x03B0 #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +0xE1 0x03B1 #GREEK SMALL LETTER ALPHA +0xE2 0x03B2 #GREEK SMALL LETTER BETA +0xE3 0x03B3 #GREEK SMALL LETTER GAMMA +0xE4 0x03B4 #GREEK SMALL LETTER DELTA +0xE5 0x03B5 #GREEK SMALL LETTER EPSILON +0xE6 0x03B6 #GREEK SMALL LETTER ZETA +0xE7 0x03B7 #GREEK SMALL LETTER ETA +0xE8 0x03B8 #GREEK SMALL LETTER THETA +0xE9 0x03B9 #GREEK SMALL LETTER IOTA +0xEA 0x03BA #GREEK SMALL LETTER KAPPA +0xEB 0x03BB #GREEK SMALL LETTER LAMDA +0xEC 0x03BC #GREEK SMALL LETTER MU +0xED 0x03BD #GREEK SMALL LETTER NU +0xEE 0x03BE #GREEK SMALL LETTER XI +0xEF 0x03BF #GREEK SMALL LETTER OMICRON +0xF0 0x03C0 #GREEK SMALL LETTER PI +0xF1 0x03C1 #GREEK SMALL LETTER RHO +0xF2 0x03C2 #GREEK SMALL LETTER FINAL SIGMA +0xF3 0x03C3 #GREEK SMALL LETTER SIGMA +0xF4 0x03C4 #GREEK SMALL LETTER TAU +0xF5 0x03C5 #GREEK SMALL LETTER UPSILON +0xF6 0x03C6 #GREEK SMALL LETTER PHI +0xF7 0x03C7 #GREEK SMALL LETTER CHI +0xF8 0x03C8 #GREEK SMALL LETTER PSI +0xF9 0x03C9 #GREEK SMALL LETTER OMEGA +0xFA 0x03CA #GREEK SMALL LETTER IOTA WITH DIALYTIKA +0xFB 0x03CB #GREEK SMALL LETTER UPSILON WITH DIALYTIKA +0xFC 0x03CC #GREEK SMALL LETTER OMICRON WITH TONOS +0xFD 0x03CD #GREEK SMALL LETTER UPSILON WITH TONOS +0xFE 0x03CE #GREEK SMALL LETTER OMEGA WITH TONOS +0xFF #UNDEFINED diff --git a/data/windows/CP1254.TXT b/data/windows/CP1254.TXT new file mode 100644 index 0000000..987ed98 --- /dev/null +++ b/data/windows/CP1254.TXT @@ -0,0 +1,274 @@ +# +# Name: cp1254 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: Shawn.Steele@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1254 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1254 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT +0x89 0x2030 #PER MILLE SIGN +0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x0152 #LATIN CAPITAL LIGATURE OE +0x8D #UNDEFINED +0x8E #UNDEFINED +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 0x02DC #SMALL TILDE +0x99 0x2122 #TRADE MARK SIGN +0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x0153 #LATIN SMALL LIGATURE OE +0x9D #UNDEFINED +0x9E #UNDEFINED +0x9F 0x0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x00A1 #INVERTED EXCLAMATION MARK +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x00AA #FEMININE ORDINAL INDICATOR +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00AF #MACRON +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x00BA #MASCULINE ORDINAL INDICATOR +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x00BF #INVERTED QUESTION MARK +0xC0 0x00C0 #LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 #LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 #LATIN CAPITAL LETTER AE +0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 #LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC #LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF #LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x011E #LATIN CAPITAL LETTER G WITH BREVE +0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 #LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 #LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 #LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x0130 #LATIN CAPITAL LETTER I WITH DOT ABOVE +0xDE 0x015E #LATIN CAPITAL LETTER S WITH CEDILLA +0xDF 0x00DF #LATIN SMALL LETTER SHARP S +0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 #LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 #LATIN SMALL LETTER AE +0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC #LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x011F #LATIN SMALL LETTER G WITH BREVE +0xF1 0x00F1 #LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 #LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 #LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x00F8 #LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x0131 #LATIN SMALL LETTER DOTLESS I +0xFE 0x015F #LATIN SMALL LETTER S WITH CEDILLA +0xFF 0x00FF #LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/data/windows/CP1255.TXT b/data/windows/CP1255.TXT new file mode 100644 index 0000000..585f993 --- /dev/null +++ b/data/windows/CP1255.TXT @@ -0,0 +1,274 @@ +# +# Name: cp1255 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 1/7/2000 +# +# Contact: Shawn.Steele@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1255 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1255 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT +0x89 0x2030 #PER MILLE SIGN +0x8A #UNDEFINED +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C #UNDEFINED +0x8D #UNDEFINED +0x8E #UNDEFINED +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 0x02DC #SMALL TILDE +0x99 0x2122 #TRADE MARK SIGN +0x9A #UNDEFINED +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C #UNDEFINED +0x9D #UNDEFINED +0x9E #UNDEFINED +0x9F #UNDEFINED +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x00A1 #INVERTED EXCLAMATION MARK +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x20AA #NEW SHEQEL SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x00D7 #MULTIPLICATION SIGN +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00AF #MACRON +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x00F7 #DIVISION SIGN +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x00BF #INVERTED QUESTION MARK +0xC0 0x05B0 #HEBREW POINT SHEVA +0xC1 0x05B1 #HEBREW POINT HATAF SEGOL +0xC2 0x05B2 #HEBREW POINT HATAF PATAH +0xC3 0x05B3 #HEBREW POINT HATAF QAMATS +0xC4 0x05B4 #HEBREW POINT HIRIQ +0xC5 0x05B5 #HEBREW POINT TSERE +0xC6 0x05B6 #HEBREW POINT SEGOL +0xC7 0x05B7 #HEBREW POINT PATAH +0xC8 0x05B8 #HEBREW POINT QAMATS +0xC9 0x05B9 #HEBREW POINT HOLAM +0xCA #UNDEFINED +0xCB 0x05BB #HEBREW POINT QUBUTS +0xCC 0x05BC #HEBREW POINT DAGESH OR MAPIQ +0xCD 0x05BD #HEBREW POINT METEG +0xCE 0x05BE #HEBREW PUNCTUATION MAQAF +0xCF 0x05BF #HEBREW POINT RAFE +0xD0 0x05C0 #HEBREW PUNCTUATION PASEQ +0xD1 0x05C1 #HEBREW POINT SHIN DOT +0xD2 0x05C2 #HEBREW POINT SIN DOT +0xD3 0x05C3 #HEBREW PUNCTUATION SOF PASUQ +0xD4 0x05F0 #HEBREW LIGATURE YIDDISH DOUBLE VAV +0xD5 0x05F1 #HEBREW LIGATURE YIDDISH VAV YOD +0xD6 0x05F2 #HEBREW LIGATURE YIDDISH DOUBLE YOD +0xD7 0x05F3 #HEBREW PUNCTUATION GERESH +0xD8 0x05F4 #HEBREW PUNCTUATION GERSHAYIM +0xD9 #UNDEFINED +0xDA #UNDEFINED +0xDB #UNDEFINED +0xDC #UNDEFINED +0xDD #UNDEFINED +0xDE #UNDEFINED +0xDF #UNDEFINED +0xE0 0x05D0 #HEBREW LETTER ALEF +0xE1 0x05D1 #HEBREW LETTER BET +0xE2 0x05D2 #HEBREW LETTER GIMEL +0xE3 0x05D3 #HEBREW LETTER DALET +0xE4 0x05D4 #HEBREW LETTER HE +0xE5 0x05D5 #HEBREW LETTER VAV +0xE6 0x05D6 #HEBREW LETTER ZAYIN +0xE7 0x05D7 #HEBREW LETTER HET +0xE8 0x05D8 #HEBREW LETTER TET +0xE9 0x05D9 #HEBREW LETTER YOD +0xEA 0x05DA #HEBREW LETTER FINAL KAF +0xEB 0x05DB #HEBREW LETTER KAF +0xEC 0x05DC #HEBREW LETTER LAMED +0xED 0x05DD #HEBREW LETTER FINAL MEM +0xEE 0x05DE #HEBREW LETTER MEM +0xEF 0x05DF #HEBREW LETTER FINAL NUN +0xF0 0x05E0 #HEBREW LETTER NUN +0xF1 0x05E1 #HEBREW LETTER SAMEKH +0xF2 0x05E2 #HEBREW LETTER AYIN +0xF3 0x05E3 #HEBREW LETTER FINAL PE +0xF4 0x05E4 #HEBREW LETTER PE +0xF5 0x05E5 #HEBREW LETTER FINAL TSADI +0xF6 0x05E6 #HEBREW LETTER TSADI +0xF7 0x05E7 #HEBREW LETTER QOF +0xF8 0x05E8 #HEBREW LETTER RESH +0xF9 0x05E9 #HEBREW LETTER SHIN +0xFA 0x05EA #HEBREW LETTER TAV +0xFB #UNDEFINED +0xFC #UNDEFINED +0xFD 0x200E #LEFT-TO-RIGHT MARK +0xFE 0x200F #RIGHT-TO-LEFT MARK +0xFF #UNDEFINED diff --git a/data/windows/CP1256.TXT b/data/windows/CP1256.TXT new file mode 100644 index 0000000..244dcce --- /dev/null +++ b/data/windows/CP1256.TXT @@ -0,0 +1,274 @@ +# +# Name: cp1256 to Unicode table +# Unicode version: 2.1 +# Table version: 2.01 +# Table format: Format A +# Date: 01/5/99 +# +# Contact: Shawn.Steele@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1256 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1256 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 0x067E #ARABIC LETTER PEH +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT +0x89 0x2030 #PER MILLE SIGN +0x8A 0x0679 #ARABIC LETTER TTEH +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x0152 #LATIN CAPITAL LIGATURE OE +0x8D 0x0686 #ARABIC LETTER TCHEH +0x8E 0x0698 #ARABIC LETTER JEH +0x8F 0x0688 #ARABIC LETTER DDAL +0x90 0x06AF #ARABIC LETTER GAF +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 0x06A9 #ARABIC LETTER KEHEH +0x99 0x2122 #TRADE MARK SIGN +0x9A 0x0691 #ARABIC LETTER RREH +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x0153 #LATIN SMALL LIGATURE OE +0x9D 0x200C #ZERO WIDTH NON-JOINER +0x9E 0x200D #ZERO WIDTH JOINER +0x9F 0x06BA #ARABIC LETTER NOON GHUNNA +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x060C #ARABIC COMMA +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x06BE #ARABIC LETTER HEH DOACHASHMEE +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00AF #MACRON +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x061B #ARABIC SEMICOLON +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x061F #ARABIC QUESTION MARK +0xC0 0x06C1 #ARABIC LETTER HEH GOAL +0xC1 0x0621 #ARABIC LETTER HAMZA +0xC2 0x0622 #ARABIC LETTER ALEF WITH MADDA ABOVE +0xC3 0x0623 #ARABIC LETTER ALEF WITH HAMZA ABOVE +0xC4 0x0624 #ARABIC LETTER WAW WITH HAMZA ABOVE +0xC5 0x0625 #ARABIC LETTER ALEF WITH HAMZA BELOW +0xC6 0x0626 #ARABIC LETTER YEH WITH HAMZA ABOVE +0xC7 0x0627 #ARABIC LETTER ALEF +0xC8 0x0628 #ARABIC LETTER BEH +0xC9 0x0629 #ARABIC LETTER TEH MARBUTA +0xCA 0x062A #ARABIC LETTER TEH +0xCB 0x062B #ARABIC LETTER THEH +0xCC 0x062C #ARABIC LETTER JEEM +0xCD 0x062D #ARABIC LETTER HAH +0xCE 0x062E #ARABIC LETTER KHAH +0xCF 0x062F #ARABIC LETTER DAL +0xD0 0x0630 #ARABIC LETTER THAL +0xD1 0x0631 #ARABIC LETTER REH +0xD2 0x0632 #ARABIC LETTER ZAIN +0xD3 0x0633 #ARABIC LETTER SEEN +0xD4 0x0634 #ARABIC LETTER SHEEN +0xD5 0x0635 #ARABIC LETTER SAD +0xD6 0x0636 #ARABIC LETTER DAD +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x0637 #ARABIC LETTER TAH +0xD9 0x0638 #ARABIC LETTER ZAH +0xDA 0x0639 #ARABIC LETTER AIN +0xDB 0x063A #ARABIC LETTER GHAIN +0xDC 0x0640 #ARABIC TATWEEL +0xDD 0x0641 #ARABIC LETTER FEH +0xDE 0x0642 #ARABIC LETTER QAF +0xDF 0x0643 #ARABIC LETTER KAF +0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE +0xE1 0x0644 #ARABIC LETTER LAM +0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x0645 #ARABIC LETTER MEEM +0xE4 0x0646 #ARABIC LETTER NOON +0xE5 0x0647 #ARABIC LETTER HEH +0xE6 0x0648 #ARABIC LETTER WAW +0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x0649 #ARABIC LETTER ALEF MAKSURA +0xED 0x064A #ARABIC LETTER YEH +0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x064B #ARABIC FATHATAN +0xF1 0x064C #ARABIC DAMMATAN +0xF2 0x064D #ARABIC KASRATAN +0xF3 0x064E #ARABIC FATHA +0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x064F #ARABIC DAMMA +0xF6 0x0650 #ARABIC KASRA +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x0651 #ARABIC SHADDA +0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE +0xFA 0x0652 #ARABIC SUKUN +0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x200E #LEFT-TO-RIGHT MARK +0xFE 0x200F #RIGHT-TO-LEFT MARK +0xFF 0x06D2 #ARABIC LETTER YEH BARREE diff --git a/data/windows/CP1257.TXT b/data/windows/CP1257.TXT new file mode 100644 index 0000000..0dc475e --- /dev/null +++ b/data/windows/CP1257.TXT @@ -0,0 +1,274 @@ +# +# Name: cp1257 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: Shawn.Steele@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1257 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1257 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 #UNDEFINED +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 #UNDEFINED +0x89 0x2030 #PER MILLE SIGN +0x8A #UNDEFINED +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C #UNDEFINED +0x8D 0x00A8 #DIAERESIS +0x8E 0x02C7 #CARON +0x8F 0x00B8 #CEDILLA +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 #UNDEFINED +0x99 0x2122 #TRADE MARK SIGN +0x9A #UNDEFINED +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C #UNDEFINED +0x9D 0x00AF #MACRON +0x9E 0x02DB #OGONEK +0x9F #UNDEFINED +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 #UNDEFINED +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 #UNDEFINED +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x0156 #LATIN CAPITAL LETTER R WITH CEDILLA +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00C6 #LATIN CAPITAL LETTER AE +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00F8 #LATIN SMALL LETTER O WITH STROKE +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x0157 #LATIN SMALL LETTER R WITH CEDILLA +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x00E6 #LATIN SMALL LETTER AE +0xC0 0x0104 #LATIN CAPITAL LETTER A WITH OGONEK +0xC1 0x012E #LATIN CAPITAL LETTER I WITH OGONEK +0xC2 0x0100 #LATIN CAPITAL LETTER A WITH MACRON +0xC3 0x0106 #LATIN CAPITAL LETTER C WITH ACUTE +0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x0118 #LATIN CAPITAL LETTER E WITH OGONEK +0xC7 0x0112 #LATIN CAPITAL LETTER E WITH MACRON +0xC8 0x010C #LATIN CAPITAL LETTER C WITH CARON +0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x0179 #LATIN CAPITAL LETTER Z WITH ACUTE +0xCB 0x0116 #LATIN CAPITAL LETTER E WITH DOT ABOVE +0xCC 0x0122 #LATIN CAPITAL LETTER G WITH CEDILLA +0xCD 0x0136 #LATIN CAPITAL LETTER K WITH CEDILLA +0xCE 0x012A #LATIN CAPITAL LETTER I WITH MACRON +0xCF 0x013B #LATIN CAPITAL LETTER L WITH CEDILLA +0xD0 0x0160 #LATIN CAPITAL LETTER S WITH CARON +0xD1 0x0143 #LATIN CAPITAL LETTER N WITH ACUTE +0xD2 0x0145 #LATIN CAPITAL LETTER N WITH CEDILLA +0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x014C #LATIN CAPITAL LETTER O WITH MACRON +0xD5 0x00D5 #LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x0172 #LATIN CAPITAL LETTER U WITH OGONEK +0xD9 0x0141 #LATIN CAPITAL LETTER L WITH STROKE +0xDA 0x015A #LATIN CAPITAL LETTER S WITH ACUTE +0xDB 0x016A #LATIN CAPITAL LETTER U WITH MACRON +0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x017B #LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xDE 0x017D #LATIN CAPITAL LETTER Z WITH CARON +0xDF 0x00DF #LATIN SMALL LETTER SHARP S +0xE0 0x0105 #LATIN SMALL LETTER A WITH OGONEK +0xE1 0x012F #LATIN SMALL LETTER I WITH OGONEK +0xE2 0x0101 #LATIN SMALL LETTER A WITH MACRON +0xE3 0x0107 #LATIN SMALL LETTER C WITH ACUTE +0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x0119 #LATIN SMALL LETTER E WITH OGONEK +0xE7 0x0113 #LATIN SMALL LETTER E WITH MACRON +0xE8 0x010D #LATIN SMALL LETTER C WITH CARON +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x017A #LATIN SMALL LETTER Z WITH ACUTE +0xEB 0x0117 #LATIN SMALL LETTER E WITH DOT ABOVE +0xEC 0x0123 #LATIN SMALL LETTER G WITH CEDILLA +0xED 0x0137 #LATIN SMALL LETTER K WITH CEDILLA +0xEE 0x012B #LATIN SMALL LETTER I WITH MACRON +0xEF 0x013C #LATIN SMALL LETTER L WITH CEDILLA +0xF0 0x0161 #LATIN SMALL LETTER S WITH CARON +0xF1 0x0144 #LATIN SMALL LETTER N WITH ACUTE +0xF2 0x0146 #LATIN SMALL LETTER N WITH CEDILLA +0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE +0xF4 0x014D #LATIN SMALL LETTER O WITH MACRON +0xF5 0x00F5 #LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x0173 #LATIN SMALL LETTER U WITH OGONEK +0xF9 0x0142 #LATIN SMALL LETTER L WITH STROKE +0xFA 0x015B #LATIN SMALL LETTER S WITH ACUTE +0xFB 0x016B #LATIN SMALL LETTER U WITH MACRON +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x017C #LATIN SMALL LETTER Z WITH DOT ABOVE +0xFE 0x017E #LATIN SMALL LETTER Z WITH CARON +0xFF 0x02D9 #DOT ABOVE diff --git a/data/windows/CP1258.TXT b/data/windows/CP1258.TXT new file mode 100644 index 0000000..f402b34 --- /dev/null +++ b/data/windows/CP1258.TXT @@ -0,0 +1,274 @@ +# +# Name: cp1258 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: Shawn.Steele@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1258 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1258 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT +0x89 0x2030 #PER MILLE SIGN +0x8A #UNDEFINED +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x0152 #LATIN CAPITAL LIGATURE OE +0x8D #UNDEFINED +0x8E #UNDEFINED +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 0x02DC #SMALL TILDE +0x99 0x2122 #TRADE MARK SIGN +0x9A #UNDEFINED +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x0153 #LATIN SMALL LIGATURE OE +0x9D #UNDEFINED +0x9E #UNDEFINED +0x9F 0x0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x00A1 #INVERTED EXCLAMATION MARK +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x00AA #FEMININE ORDINAL INDICATOR +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00AF #MACRON +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x00BA #MASCULINE ORDINAL INDICATOR +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x00BF #INVERTED QUESTION MARK +0xC0 0x00C0 #LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x0102 #LATIN CAPITAL LETTER A WITH BREVE +0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 #LATIN CAPITAL LETTER AE +0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 #LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x0300 #COMBINING GRAVE ACCENT +0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF #LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x0110 #LATIN CAPITAL LETTER D WITH STROKE +0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x0309 #COMBINING HOOK ABOVE +0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x01A0 #LATIN CAPITAL LETTER O WITH HORN +0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 #LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x01AF #LATIN CAPITAL LETTER U WITH HORN +0xDE 0x0303 #COMBINING TILDE +0xDF 0x00DF #LATIN SMALL LETTER SHARP S +0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x0103 #LATIN SMALL LETTER A WITH BREVE +0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 #LATIN SMALL LETTER AE +0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x0301 #COMBINING ACUTE ACCENT +0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x0111 #LATIN SMALL LETTER D WITH STROKE +0xF1 0x00F1 #LATIN SMALL LETTER N WITH TILDE +0xF2 0x0323 #COMBINING DOT BELOW +0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x01A1 #LATIN SMALL LETTER O WITH HORN +0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x00F8 #LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x01B0 #LATIN SMALL LETTER U WITH HORN +0xFE 0x20AB #DONG SIGN +0xFF 0x00FF #LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/data/windows/CP874.TXT b/data/windows/CP874.TXT new file mode 100644 index 0000000..0ab6504 --- /dev/null +++ b/data/windows/CP874.TXT @@ -0,0 +1,274 @@ +# +# Name: cp874 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 02/28/98 +# +# Contact: Shawn.Steele@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp874 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp874 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 #UNDEFINED +0x83 #UNDEFINED +0x84 #UNDEFINED +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 #UNDEFINED +0x87 #UNDEFINED +0x88 #UNDEFINED +0x89 #UNDEFINED +0x8A #UNDEFINED +0x8B #UNDEFINED +0x8C #UNDEFINED +0x8D #UNDEFINED +0x8E #UNDEFINED +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 #UNDEFINED +0x99 #UNDEFINED +0x9A #UNDEFINED +0x9B #UNDEFINED +0x9C #UNDEFINED +0x9D #UNDEFINED +0x9E #UNDEFINED +0x9F #UNDEFINED +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x0E01 #THAI CHARACTER KO KAI +0xA2 0x0E02 #THAI CHARACTER KHO KHAI +0xA3 0x0E03 #THAI CHARACTER KHO KHUAT +0xA4 0x0E04 #THAI CHARACTER KHO KHWAI +0xA5 0x0E05 #THAI CHARACTER KHO KHON +0xA6 0x0E06 #THAI CHARACTER KHO RAKHANG +0xA7 0x0E07 #THAI CHARACTER NGO NGU +0xA8 0x0E08 #THAI CHARACTER CHO CHAN +0xA9 0x0E09 #THAI CHARACTER CHO CHING +0xAA 0x0E0A #THAI CHARACTER CHO CHANG +0xAB 0x0E0B #THAI CHARACTER SO SO +0xAC 0x0E0C #THAI CHARACTER CHO CHOE +0xAD 0x0E0D #THAI CHARACTER YO YING +0xAE 0x0E0E #THAI CHARACTER DO CHADA +0xAF 0x0E0F #THAI CHARACTER TO PATAK +0xB0 0x0E10 #THAI CHARACTER THO THAN +0xB1 0x0E11 #THAI CHARACTER THO NANGMONTHO +0xB2 0x0E12 #THAI CHARACTER THO PHUTHAO +0xB3 0x0E13 #THAI CHARACTER NO NEN +0xB4 0x0E14 #THAI CHARACTER DO DEK +0xB5 0x0E15 #THAI CHARACTER TO TAO +0xB6 0x0E16 #THAI CHARACTER THO THUNG +0xB7 0x0E17 #THAI CHARACTER THO THAHAN +0xB8 0x0E18 #THAI CHARACTER THO THONG +0xB9 0x0E19 #THAI CHARACTER NO NU +0xBA 0x0E1A #THAI CHARACTER BO BAIMAI +0xBB 0x0E1B #THAI CHARACTER PO PLA +0xBC 0x0E1C #THAI CHARACTER PHO PHUNG +0xBD 0x0E1D #THAI CHARACTER FO FA +0xBE 0x0E1E #THAI CHARACTER PHO PHAN +0xBF 0x0E1F #THAI CHARACTER FO FAN +0xC0 0x0E20 #THAI CHARACTER PHO SAMPHAO +0xC1 0x0E21 #THAI CHARACTER MO MA +0xC2 0x0E22 #THAI CHARACTER YO YAK +0xC3 0x0E23 #THAI CHARACTER RO RUA +0xC4 0x0E24 #THAI CHARACTER RU +0xC5 0x0E25 #THAI CHARACTER LO LING +0xC6 0x0E26 #THAI CHARACTER LU +0xC7 0x0E27 #THAI CHARACTER WO WAEN +0xC8 0x0E28 #THAI CHARACTER SO SALA +0xC9 0x0E29 #THAI CHARACTER SO RUSI +0xCA 0x0E2A #THAI CHARACTER SO SUA +0xCB 0x0E2B #THAI CHARACTER HO HIP +0xCC 0x0E2C #THAI CHARACTER LO CHULA +0xCD 0x0E2D #THAI CHARACTER O ANG +0xCE 0x0E2E #THAI CHARACTER HO NOKHUK +0xCF 0x0E2F #THAI CHARACTER PAIYANNOI +0xD0 0x0E30 #THAI CHARACTER SARA A +0xD1 0x0E31 #THAI CHARACTER MAI HAN-AKAT +0xD2 0x0E32 #THAI CHARACTER SARA AA +0xD3 0x0E33 #THAI CHARACTER SARA AM +0xD4 0x0E34 #THAI CHARACTER SARA I +0xD5 0x0E35 #THAI CHARACTER SARA II +0xD6 0x0E36 #THAI CHARACTER SARA UE +0xD7 0x0E37 #THAI CHARACTER SARA UEE +0xD8 0x0E38 #THAI CHARACTER SARA U +0xD9 0x0E39 #THAI CHARACTER SARA UU +0xDA 0x0E3A #THAI CHARACTER PHINTHU +0xDB #UNDEFINED +0xDC #UNDEFINED +0xDD #UNDEFINED +0xDE #UNDEFINED +0xDF 0x0E3F #THAI CURRENCY SYMBOL BAHT +0xE0 0x0E40 #THAI CHARACTER SARA E +0xE1 0x0E41 #THAI CHARACTER SARA AE +0xE2 0x0E42 #THAI CHARACTER SARA O +0xE3 0x0E43 #THAI CHARACTER SARA AI MAIMUAN +0xE4 0x0E44 #THAI CHARACTER SARA AI MAIMALAI +0xE5 0x0E45 #THAI CHARACTER LAKKHANGYAO +0xE6 0x0E46 #THAI CHARACTER MAIYAMOK +0xE7 0x0E47 #THAI CHARACTER MAITAIKHU +0xE8 0x0E48 #THAI CHARACTER MAI EK +0xE9 0x0E49 #THAI CHARACTER MAI THO +0xEA 0x0E4A #THAI CHARACTER MAI TRI +0xEB 0x0E4B #THAI CHARACTER MAI CHATTAWA +0xEC 0x0E4C #THAI CHARACTER THANTHAKHAT +0xED 0x0E4D #THAI CHARACTER NIKHAHIT +0xEE 0x0E4E #THAI CHARACTER YAMAKKAN +0xEF 0x0E4F #THAI CHARACTER FONGMAN +0xF0 0x0E50 #THAI DIGIT ZERO +0xF1 0x0E51 #THAI DIGIT ONE +0xF2 0x0E52 #THAI DIGIT TWO +0xF3 0x0E53 #THAI DIGIT THREE +0xF4 0x0E54 #THAI DIGIT FOUR +0xF5 0x0E55 #THAI DIGIT FIVE +0xF6 0x0E56 #THAI DIGIT SIX +0xF7 0x0E57 #THAI DIGIT SEVEN +0xF8 0x0E58 #THAI DIGIT EIGHT +0xF9 0x0E59 #THAI DIGIT NINE +0xFA 0x0E5A #THAI CHARACTER ANGKHANKHU +0xFB 0x0E5B #THAI CHARACTER KHOMUT +0xFC #UNDEFINED +0xFD #UNDEFINED +0xFE #UNDEFINED +0xFF #UNDEFINED diff --git a/data/CP932.TXT b/data/windows/CP932.TXT similarity index 100% rename from data/CP932.TXT rename to data/windows/CP932.TXT diff --git a/data/CP936.TXT b/data/windows/CP936.TXT similarity index 100% rename from data/CP936.TXT rename to data/windows/CP936.TXT diff --git a/data/CP949.TXT b/data/windows/CP949.TXT similarity index 100% rename from data/CP949.TXT rename to data/windows/CP949.TXT diff --git a/data/CP950.TXT b/data/windows/CP950.TXT similarity index 100% rename from data/CP950.TXT rename to data/windows/CP950.TXT diff --git a/src/lib.rs b/src/lib.rs index 7213405..7dbf8c7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,31 +1,39 @@ -//! Bidirectional conversion between MS-DOS code pages and Unicode. +//! Bidirectional conversion between Microsoft code pages and Unicode. //! //! MS-DOS and the FAT family of filesystems stored text in one of a family of -//! OEM code pages selected by country/locale. This crate converts those bytes -//! to and from Unicode with emulator-grade fidelity: it owns the canonical -//! tables rather than linking ICU, so it stays small, self-contained, and -//! cross-compiles cleanly. +//! OEM code pages selected by country/locale, and Windows-era files add the +//! ANSI ("125x") family on top. This crate converts those bytes to and from +//! Unicode with emulator-grade fidelity: it owns the canonical tables rather +//! than linking ICU, so it stays small, self-contained, and cross-compiles +//! cleanly. //! //! The tables are **Microsoft's** mappings as published by the Unicode //! Consortium (`VENDORS/MICSFT/`) — not the IBM or Oracle variants, which -//! differ in a handful of slots. All sixteen single-byte DOS pages are always -//! available; the double-byte CJK pages (932 Shift-JIS, 936 GBK, 949 Korean, -//! 950 Big5) sit behind the on-by-default `dbcs` feature because their tables -//! are large. +//! differ in a handful of slots. Two families are exposed: +//! +//! - [`DosEncoding`] — the sixteen single-byte OEM pages, always available, +//! plus the double-byte CJK pages (932 Shift-JIS, 936 GBK, 949 Korean, +//! 950 Big5) behind the on-by-default `dbcs` feature (their tables are +//! large). +//! - [`WindowsEncoding`] — the ten single-byte ANSI pages (874 Thai and +//! 1250–1258), always available. //! //! Decoding is fallible: several pages leave byte values undefined, and the -//! double-byte pages add truncated/undefined pair failures. -//! [`DosEncoding::decode_lossy`] substitutes U+FFFD instead. Anything a page -//! decodes re-encodes to the same bytes, except the handful of CP932/CP950 -//! codes that share a scalar — those re-encode to Microsoft's preferred code, -//! exactly as Windows does. +//! double-byte pages add truncated/undefined pair failures. The `decode_lossy` +//! methods substitute U+FFFD instead. Anything a page decodes re-encodes to +//! the same bytes, except the handful of CP932/CP950 codes that share a +//! scalar — those re-encode to Microsoft's preferred code, exactly as Windows +//! does. //! //! ``` -//! use msdos_encodings::DosEncoding; +//! use msdos_encodings::{DosEncoding, WindowsEncoding}; //! //! let enc = DosEncoding::default(); // code page 437 //! assert_eq!(enc.decode(b"Caf\x82").unwrap(), "Café"); //! assert_eq!(enc.encode("Café").unwrap(), b"Caf\x82"); +//! +//! let enc = WindowsEncoding::default(); // code page 1252 +//! assert_eq!(enc.decode(b"Caf\xE9").unwrap(), "Café"); //! ``` #![forbid(unsafe_code)] #![warn(missing_docs)] @@ -213,15 +221,7 @@ impl DosEncoding { /// [`DecodeError::TruncatedPair`] and [`DecodeError::UndefinedPair`]. pub fn decode(self, bytes: &[u8]) -> Result { match self.codec() { - Codec::Single(table) => bytes - .iter() - .map(|&byte| { - table[usize::from(byte)].ok_or(DecodeError::Undefined { - byte, - encoding: self, - }) - }) - .collect(), + Codec::Single(table) => decode_single(table, bytes, self.into()), #[cfg(feature = "dbcs")] Codec::Dbcs(page) => self.decode_dbcs(page, bytes), } @@ -234,10 +234,7 @@ impl DosEncoding { #[must_use] pub fn decode_lossy(self, bytes: &[u8]) -> String { match self.codec() { - Codec::Single(table) => bytes - .iter() - .map(|&byte| table[usize::from(byte)].unwrap_or(REPLACEMENT)) - .collect(), + Codec::Single(table) => decode_single_lossy(table, bytes), #[cfg(feature = "dbcs")] Codec::Dbcs(page) => Self::decode_dbcs_lossy(page, bytes), } @@ -251,8 +248,7 @@ impl DosEncoding { /// /// Returns [`DecodeError`] as [`decode`](Self::decode) does. pub fn decode_cstr(self, bytes: &[u8]) -> Result { - let end = bytes.iter().position(|&b| b == 0).unwrap_or(bytes.len()); - self.decode(&bytes[..end]) + self.decode(cstr_prefix(bytes)) } /// Encode `text` back to this code page's bytes. @@ -264,16 +260,7 @@ impl DosEncoding { /// under DOS Arabic, whose `0x25` is ARABIC PERCENT SIGN). pub fn encode(self, text: &str) -> Result, EncodeError> { match self.codec() { - Codec::Single(table) => text - .chars() - .map(|ch| { - table - .iter() - .position(|&slot| slot == Some(ch)) - .map(|i| i as u8) - .ok_or(EncodeError::Unmappable { ch, encoding: self }) - }) - .collect(), + Codec::Single(table) => encode_single(table, text, self.into()), #[cfg(feature = "dbcs")] Codec::Dbcs(page) => self.encode_dbcs(page, text), } @@ -293,21 +280,21 @@ impl DosEncoding { SingleEntry::Undefined => { return Err(DecodeError::Undefined { byte: *byte, - encoding: self, + encoding: self.into(), }) } SingleEntry::Lead => { let [trail, tail @ ..] = tail else { return Err(DecodeError::TruncatedPair { lead: *byte, - encoding: self, + encoding: self.into(), }); }; let ch = lookup_pair(page, *byte, *trail).ok_or(DecodeError::UndefinedPair { lead: *byte, trail: *trail, - encoding: self, + encoding: self.into(), })?; out.push(ch); rest = tail; @@ -361,7 +348,10 @@ impl DosEncoding { let (_, code) = page.encode[i]; out.extend_from_slice(&code.to_be_bytes()); } else { - return Err(EncodeError::Unmappable { ch, encoding: self }); + return Err(EncodeError::Unmappable { + ch, + encoding: self.into(), + }); } } Ok(out) @@ -370,22 +360,22 @@ impl DosEncoding { /// The lookup machinery for this code page. fn codec(self) -> Codec { match self { - Self::Cp437 => Codec::Single(&tables::single::CP437), - Self::Cp737 => Codec::Single(&tables::single::CP737), - Self::Cp775 => Codec::Single(&tables::single::CP775), - Self::Cp850 => Codec::Single(&tables::single::CP850), - Self::Cp852 => Codec::Single(&tables::single::CP852), - Self::Cp855 => Codec::Single(&tables::single::CP855), - Self::Cp857 => Codec::Single(&tables::single::CP857), - Self::Cp860 => Codec::Single(&tables::single::CP860), - Self::Cp861 => Codec::Single(&tables::single::CP861), - Self::Cp862 => Codec::Single(&tables::single::CP862), - Self::Cp863 => Codec::Single(&tables::single::CP863), - Self::Cp864 => Codec::Single(&tables::single::CP864), - Self::Cp865 => Codec::Single(&tables::single::CP865), - Self::Cp866 => Codec::Single(&tables::single::CP866), - Self::Cp869 => Codec::Single(&tables::single::CP869), - Self::Cp874 => Codec::Single(&tables::single::CP874), + Self::Cp437 => Codec::Single(&tables::dos::CP437), + Self::Cp737 => Codec::Single(&tables::dos::CP737), + Self::Cp775 => Codec::Single(&tables::dos::CP775), + Self::Cp850 => Codec::Single(&tables::dos::CP850), + Self::Cp852 => Codec::Single(&tables::dos::CP852), + Self::Cp855 => Codec::Single(&tables::dos::CP855), + Self::Cp857 => Codec::Single(&tables::dos::CP857), + Self::Cp860 => Codec::Single(&tables::dos::CP860), + Self::Cp861 => Codec::Single(&tables::dos::CP861), + Self::Cp862 => Codec::Single(&tables::dos::CP862), + Self::Cp863 => Codec::Single(&tables::dos::CP863), + Self::Cp864 => Codec::Single(&tables::dos::CP864), + Self::Cp865 => Codec::Single(&tables::dos::CP865), + Self::Cp866 => Codec::Single(&tables::dos::CP866), + Self::Cp869 => Codec::Single(&tables::dos::CP869), + Self::Cp874 => Codec::Single(&tables::dos::CP874), #[cfg(feature = "dbcs")] Self::Cp932 => Codec::Dbcs(&tables::cp932::CP932), #[cfg(feature = "dbcs")] @@ -398,9 +388,258 @@ impl DosEncoding { } } +/// A Windows ANSI code page. +/// +/// These are the single-byte "125x" pages Windows uses for non-console text +/// (the `GetACP` family), as distinct from the OEM pages in [`DosEncoding`]. +/// +/// Non-exhaustive: more code pages may be added without it being a breaking +/// change, so external matches must include a wildcard arm. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)] +#[non_exhaustive] +pub enum WindowsEncoding { + /// Code page 874 — Windows Thai. Microsoft publishes the identical table + /// for DOS and Windows Thai, so this equals [`DosEncoding::Cp874`]. + Cp874, + /// Code page 1250 — Windows Central European. + Cp1250, + /// Code page 1251 — Windows Cyrillic. + Cp1251, + /// Code page 1252 — Windows Western, the near-superset of Latin-1. + #[default] + Cp1252, + /// Code page 1253 — Windows Greek. + Cp1253, + /// Code page 1254 — Windows Turkish. + Cp1254, + /// Code page 1255 — Windows Hebrew. + Cp1255, + /// Code page 1256 — Windows Arabic. + Cp1256, + /// Code page 1257 — Windows Baltic. + Cp1257, + /// Code page 1258 — Windows Vietnamese (uses combining diacritics). + Cp1258, +} + +impl WindowsEncoding { + /// Every Windows code page this crate implements, in numeric order. + pub const ALL: &'static [WindowsEncoding] = &[ + Self::Cp874, + Self::Cp1250, + Self::Cp1251, + Self::Cp1252, + Self::Cp1253, + Self::Cp1254, + Self::Cp1255, + Self::Cp1256, + Self::Cp1257, + Self::Cp1258, + ]; + + /// Select an encoding from its numeric code page identifier (an ACP value + /// from the `GetACP` family), or `None` if this crate does not implement + /// it. + #[must_use] + pub fn from_code_page(code_page: u16) -> Option { + Self::ALL + .iter() + .copied() + .find(|enc| enc.code_page() == code_page) + } + + /// The numeric code page identifier (1252, 874, …). + #[must_use] + pub fn code_page(self) -> u16 { + match self { + Self::Cp874 => 874, + Self::Cp1250 => 1250, + Self::Cp1251 => 1251, + Self::Cp1252 => 1252, + Self::Cp1253 => 1253, + Self::Cp1254 => 1254, + Self::Cp1255 => 1255, + Self::Cp1256 => 1256, + Self::Cp1257 => 1257, + Self::Cp1258 => 1258, + } + } + + /// A short human-readable name, e.g. "Windows Western". + #[must_use] + pub fn name(self) -> &'static str { + match self { + Self::Cp874 => "Windows Thai", + Self::Cp1250 => "Windows Central European", + Self::Cp1251 => "Windows Cyrillic", + Self::Cp1252 => "Windows Western", + Self::Cp1253 => "Windows Greek", + Self::Cp1254 => "Windows Turkish", + Self::Cp1255 => "Windows Hebrew", + Self::Cp1256 => "Windows Arabic", + Self::Cp1257 => "Windows Baltic", + Self::Cp1258 => "Windows Vietnamese", + } + } + + /// Decode every byte of `bytes` to Unicode, faithfully (control bytes and + /// a trailing `NUL` included). Use [`decode_cstr`](Self::decode_cstr) for + /// `NUL`-terminated fixed-width fields. + /// + /// # Errors + /// + /// Returns [`DecodeError::Undefined`] for a byte value the code page + /// leaves unmapped (every page here except 1256 has a few undefined + /// slots in the `0x80..=0x9F` region). + pub fn decode(self, bytes: &[u8]) -> Result { + decode_single(self.table(), bytes, self.into()) + } + + /// Decode like [`decode`](Self::decode), substituting U+FFFD REPLACEMENT + /// CHARACTER for any byte the code page leaves undefined. + #[must_use] + pub fn decode_lossy(self, bytes: &[u8]) -> String { + decode_single_lossy(self.table(), bytes) + } + + /// Decode up to (but not including) the first `NUL` byte. + /// + /// # Errors + /// + /// Returns [`DecodeError`] as [`decode`](Self::decode) does. + pub fn decode_cstr(self, bytes: &[u8]) -> Result { + self.decode(cstr_prefix(bytes)) + } + + /// Encode `text` back to this code page's bytes. + /// + /// # Errors + /// + /// Returns [`EncodeError::Unmappable`] for the first character with no + /// representation in this code page. + pub fn encode(self, text: &str) -> Result, EncodeError> { + encode_single(self.table(), text, self.into()) + } + + /// The full byte-to-scalar table for this code page. + fn table(self) -> &'static [Option; 256] { + match self { + Self::Cp874 => &tables::ansi::CP874, + Self::Cp1250 => &tables::ansi::CP1250, + Self::Cp1251 => &tables::ansi::CP1251, + Self::Cp1252 => &tables::ansi::CP1252, + Self::Cp1253 => &tables::ansi::CP1253, + Self::Cp1254 => &tables::ansi::CP1254, + Self::Cp1255 => &tables::ansi::CP1255, + Self::Cp1256 => &tables::ansi::CP1256, + Self::Cp1257 => &tables::ansi::CP1257, + Self::Cp1258 => &tables::ansi::CP1258, + } + } +} + +/// A code page from either Microsoft family, as carried in errors. +/// +/// Non-exhaustive: more families may be added without it being a breaking +/// change, so external matches must include a wildcard arm. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[non_exhaustive] +pub enum Encoding { + /// An OEM (DOS) code page. + Dos(DosEncoding), + /// A Windows ANSI code page. + Windows(WindowsEncoding), +} + +impl Encoding { + /// Select an encoding from its numeric code page identifier, searching + /// the DOS family first, then Windows. The only overlap is 874, whose + /// two tables are identical in Microsoft's published data. + #[must_use] + pub fn from_code_page(code_page: u16) -> Option { + DosEncoding::from_code_page(code_page) + .map(Self::Dos) + .or_else(|| WindowsEncoding::from_code_page(code_page).map(Self::Windows)) + } + + /// The numeric code page identifier. + #[must_use] + pub fn code_page(self) -> u16 { + match self { + Self::Dos(enc) => enc.code_page(), + Self::Windows(enc) => enc.code_page(), + } + } + + /// A short human-readable name. + #[must_use] + pub fn name(self) -> &'static str { + match self { + Self::Dos(enc) => enc.name(), + Self::Windows(enc) => enc.name(), + } + } +} + +impl From for Encoding { + fn from(enc: DosEncoding) -> Self { + Self::Dos(enc) + } +} + +impl From for Encoding { + fn from(enc: WindowsEncoding) -> Self { + Self::Windows(enc) + } +} + /// U+FFFD REPLACEMENT CHARACTER, used by the lossy decoders. const REPLACEMENT: char = '\u{FFFD}'; +/// Everything before the first `NUL` byte (or all of `bytes` if there is +/// none) — the shared trim behind the `decode_cstr` methods. +fn cstr_prefix(bytes: &[u8]) -> &[u8] { + let end = bytes.iter().position(|&b| b == 0).unwrap_or(bytes.len()); + &bytes[..end] +} + +/// Decode a single-byte page strictly. +fn decode_single( + table: &[Option; 256], + bytes: &[u8], + encoding: Encoding, +) -> Result { + bytes + .iter() + .map(|&byte| table[usize::from(byte)].ok_or(DecodeError::Undefined { byte, encoding })) + .collect() +} + +/// Decode a single-byte page, substituting U+FFFD for undefined bytes. +fn decode_single_lossy(table: &[Option; 256], bytes: &[u8]) -> String { + bytes + .iter() + .map(|&byte| table[usize::from(byte)].unwrap_or(REPLACEMENT)) + .collect() +} + +/// Encode to a single-byte page by scanning the table for each character. +fn encode_single( + table: &[Option; 256], + text: &str, + encoding: Encoding, +) -> Result, EncodeError> { + text.chars() + .map(|ch| { + table + .iter() + .position(|&slot| slot == Some(ch)) + .map(|i| i as u8) + .ok_or(EncodeError::Unmappable { ch, encoding }) + }) + .collect() +} + /// Look up a lead/trail pair in a DBCS page's sorted decode table. #[cfg(feature = "dbcs")] fn lookup_pair(page: &DbcsPage, lead: u8, trail: u8) -> Option { @@ -417,6 +656,18 @@ impl fmt::Display for DosEncoding { } } +impl fmt::Display for WindowsEncoding { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "code page {} ({})", self.code_page(), self.name()) + } +} + +impl fmt::Display for Encoding { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "code page {} ({})", self.code_page(), self.name()) + } +} + /// A byte sequence could not be decoded from the source code page. /// /// Non-exhaustive so future variants are not a breaking change. @@ -429,7 +680,7 @@ pub enum DecodeError { /// The offending byte value. byte: u8, /// The code page that leaves it undefined. - encoding: DosEncoding, + encoding: Encoding, }, /// A lead byte of a double-byte page appeared with no trail byte after it. #[error("lead byte {lead:#04x} at end of input in {encoding}")] @@ -437,7 +688,7 @@ pub enum DecodeError { /// The dangling lead byte. lead: u8, /// The double-byte code page being decoded. - encoding: DosEncoding, + encoding: Encoding, }, /// A lead/trail pair is not a defined code of the page. #[error("byte pair {lead:#04x} {trail:#04x} is undefined in {encoding}")] @@ -447,7 +698,7 @@ pub enum DecodeError { /// The trail byte of the pair. trail: u8, /// The double-byte code page being decoded. - encoding: DosEncoding, + encoding: Encoding, }, } @@ -463,7 +714,7 @@ pub enum EncodeError { /// The offending character. ch: char, /// The code page that lacks a mapping for it. - encoding: DosEncoding, + encoding: Encoding, }, } @@ -520,7 +771,7 @@ mod tests { enc.decode(b"a\xFFb"), Err(DecodeError::Undefined { byte: 0xFF, - encoding: enc + encoding: enc.into() }) ); assert_eq!(enc.decode_lossy(b"a\xFFb"), "a\u{FFFD}b"); @@ -629,6 +880,134 @@ mod tests { } } +#[cfg(test)] +mod ansi_tests { + use super::*; + + #[test] + fn golden_ansi_mappings() { + // Golden values straight from the Microsoft tables. + assert_eq!(WindowsEncoding::Cp1252.decode(&[0x80]).unwrap(), "€"); + assert_eq!(WindowsEncoding::Cp1252.decode(&[0x93]).unwrap(), "\u{201C}"); + assert_eq!(WindowsEncoding::Cp1251.decode(&[0xC0]).unwrap(), "А"); + assert_eq!(WindowsEncoding::Cp1255.decode(&[0xE0]).unwrap(), "א"); + assert_eq!(WindowsEncoding::Cp1253.decode(&[0xDF]).unwrap(), "ί"); + // 1258 spells Vietnamese with combining diacritics. + assert_eq!(WindowsEncoding::Cp1258.decode(&[0xCC]).unwrap(), "\u{0300}"); + } + + #[test] + fn smart_quotes_round_trip() { + let text = "\u{201C}Hello,\u{201D} she said \u{2014} twice\u{2026}"; + let bytes = WindowsEncoding::Cp1252.encode(text).unwrap(); + assert_eq!(WindowsEncoding::Cp1252.decode(&bytes).unwrap(), text); + } + + #[test] + fn undefined_c1_slots_error_and_lossy_substitutes() { + // 0x98 is the lone undefined byte in CP1251. + let enc = WindowsEncoding::Cp1251; + assert_eq!( + enc.decode(b"a\x98b"), + Err(DecodeError::Undefined { + byte: 0x98, + encoding: enc.into() + }) + ); + assert_eq!(enc.decode_lossy(b"a\x98b"), "a\u{FFFD}b"); + } + + #[test] + fn cp1256_is_fully_defined() { + for byte in 0..=0xFFu8 { + assert!(WindowsEncoding::Cp1256.decode(&[byte]).is_ok()); + } + } + + #[test] + fn every_ansi_page_round_trips_every_byte() { + for &enc in WindowsEncoding::ALL { + for byte in 0..=0xFFu8 { + match enc.decode(&[byte]) { + Ok(decoded) => assert_eq!( + enc.encode(&decoded).unwrap(), + vec![byte], + "byte {byte:#04x} failed to round-trip under {enc}" + ), + Err(DecodeError::Undefined { .. }) => { + assert_eq!(enc.decode_lossy(&[byte]), "\u{FFFD}"); + } + Err(other) => panic!("unexpected error for {byte:#04x}: {other}"), + } + } + } + } + + #[test] + fn every_ansi_table_is_a_bijection() { + for &enc in WindowsEncoding::ALL { + let mut seen = std::collections::HashSet::new(); + for slot in enc.table().iter().flatten() { + assert!(seen.insert(*slot), "duplicate scalar {slot:?} in {enc}"); + } + } + } + + #[test] + fn windows_thai_equals_dos_thai() { + // Microsoft publishes the identical 874 table for both families. + for byte in 0..=0xFFu8 { + assert_eq!( + WindowsEncoding::Cp874.decode(&[byte]).ok(), + DosEncoding::Cp874.decode(&[byte]).ok(), + ); + } + } + + #[test] + fn from_code_page_families() { + for &enc in WindowsEncoding::ALL { + assert_eq!(WindowsEncoding::from_code_page(enc.code_page()), Some(enc)); + } + assert_eq!(WindowsEncoding::from_code_page(437), None); + assert_eq!(DosEncoding::from_code_page(1252), None); + // The unified lookup searches DOS first, then Windows. + assert_eq!( + Encoding::from_code_page(437), + Some(Encoding::Dos(DosEncoding::Cp437)) + ); + assert_eq!( + Encoding::from_code_page(1252), + Some(Encoding::Windows(WindowsEncoding::Cp1252)) + ); + assert_eq!( + Encoding::from_code_page(874), + Some(Encoding::Dos(DosEncoding::Cp874)) + ); + assert_eq!(Encoding::from_code_page(65001), None); // UTF-8 is not ours + } + + #[test] + fn ansi_decode_cstr_stops_at_nul() { + let enc = WindowsEncoding::Cp1252; + assert_eq!(enc.decode_cstr(b"caf\xE9\x00junk").unwrap(), "café"); + assert_eq!(enc.decode_cstr(b"caf\xE9").unwrap(), "café"); + } + + #[test] + fn display_and_error_name_the_family() { + assert_eq!( + WindowsEncoding::Cp1252.to_string(), + "code page 1252 (Windows Western)" + ); + let err = WindowsEncoding::Cp1253.encode("é").unwrap_err(); + assert_eq!( + err.to_string(), + "character 'é' has no mapping in code page 1253 (Windows Greek)" + ); + } +} + #[cfg(all(test, not(feature = "dbcs")))] mod no_dbcs_tests { use super::*; @@ -722,7 +1101,7 @@ mod dbcs_tests { enc.decode(b"abc\x93"), Err(DecodeError::TruncatedPair { lead: 0x93, - encoding: enc + encoding: enc.into() }) ); assert_eq!(enc.decode_lossy(b"abc\x93"), "abc\u{FFFD}"); @@ -737,7 +1116,7 @@ mod dbcs_tests { Err(DecodeError::UndefinedPair { lead: 0x81, trail: 0x00, - encoding: enc + encoding: enc.into() }) ); assert_eq!(enc.decode_lossy(b"\x81\x00A"), "\u{FFFD}A"); @@ -751,7 +1130,7 @@ mod dbcs_tests { enc.decode(&[0x80]), Err(DecodeError::Undefined { byte: 0x80, - encoding: enc + encoding: enc.into() }) ); assert_eq!(enc.decode_lossy(&[0x80]), "\u{FFFD}"); diff --git a/src/tables/ansi.rs b/src/tables/ansi.rs new file mode 100644 index 0000000..8bade27 --- /dev/null +++ b/src/tables/ansi.rs @@ -0,0 +1,2604 @@ +//! Generated by `tools/gen_tables.py` — do not edit by hand. +//! +//! Source: the Unicode Consortium's Microsoft mapping tables, vendored in +//! `data/`. + +/// Code page 874, byte value to Unicode scalar. +pub(crate) const CP874: [Option; 256] = [ + Some('\u{0000}'), + Some('\u{0001}'), + Some('\u{0002}'), + Some('\u{0003}'), + Some('\u{0004}'), + Some('\u{0005}'), + Some('\u{0006}'), + Some('\u{0007}'), // 0x00-0x07 + Some('\u{0008}'), + Some('\u{0009}'), + Some('\u{000A}'), + Some('\u{000B}'), + Some('\u{000C}'), + Some('\u{000D}'), + Some('\u{000E}'), + Some('\u{000F}'), // 0x08-0x0f + Some('\u{0010}'), + Some('\u{0011}'), + Some('\u{0012}'), + Some('\u{0013}'), + Some('\u{0014}'), + Some('\u{0015}'), + Some('\u{0016}'), + Some('\u{0017}'), // 0x10-0x17 + Some('\u{0018}'), + Some('\u{0019}'), + Some('\u{001A}'), + Some('\u{001B}'), + Some('\u{001C}'), + Some('\u{001D}'), + Some('\u{001E}'), + Some('\u{001F}'), // 0x18-0x1f + Some(' '), + Some('!'), + Some('"'), + Some('#'), + Some('$'), + Some('%'), + Some('&'), + Some('\u{0027}'), // 0x20-0x27 + Some('('), + Some(')'), + Some('*'), + Some('+'), + Some(','), + Some('-'), + Some('.'), + Some('/'), // 0x28-0x2f + Some('0'), + Some('1'), + Some('2'), + Some('3'), + Some('4'), + Some('5'), + Some('6'), + Some('7'), // 0x30-0x37 + Some('8'), + Some('9'), + Some(':'), + Some(';'), + Some('<'), + Some('='), + Some('>'), + Some('?'), // 0x38-0x3f + Some('@'), + Some('A'), + Some('B'), + Some('C'), + Some('D'), + Some('E'), + Some('F'), + Some('G'), // 0x40-0x47 + Some('H'), + Some('I'), + Some('J'), + Some('K'), + Some('L'), + Some('M'), + Some('N'), + Some('O'), // 0x48-0x4f + Some('P'), + Some('Q'), + Some('R'), + Some('S'), + Some('T'), + Some('U'), + Some('V'), + Some('W'), // 0x50-0x57 + Some('X'), + Some('Y'), + Some('Z'), + Some('['), + Some('\u{005C}'), + Some(']'), + Some('^'), + Some('_'), // 0x58-0x5f + Some('`'), + Some('a'), + Some('b'), + Some('c'), + Some('d'), + Some('e'), + Some('f'), + Some('g'), // 0x60-0x67 + Some('h'), + Some('i'), + Some('j'), + Some('k'), + Some('l'), + Some('m'), + Some('n'), + Some('o'), // 0x68-0x6f + Some('p'), + Some('q'), + Some('r'), + Some('s'), + Some('t'), + Some('u'), + Some('v'), + Some('w'), // 0x70-0x77 + Some('x'), + Some('y'), + Some('z'), + Some('{'), + Some('|'), + Some('}'), + Some('~'), + Some('\u{007F}'), // 0x78-0x7f + Some('€'), + None, + None, + None, + None, + Some('…'), + None, + None, // 0x80-0x87 + None, + None, + None, + None, + None, + None, + None, + None, // 0x88-0x8f + None, + Some('‘'), + Some('’'), + Some('“'), + Some('”'), + Some('•'), + Some('–'), + Some('—'), // 0x90-0x97 + None, + None, + None, + None, + None, + None, + None, + None, // 0x98-0x9f + Some('\u{00A0}'), + Some('ก'), + Some('ข'), + Some('ฃ'), + Some('ค'), + Some('ฅ'), + Some('ฆ'), + Some('ง'), // 0xa0-0xa7 + Some('จ'), + Some('ฉ'), + Some('ช'), + Some('ซ'), + Some('ฌ'), + Some('ญ'), + Some('ฎ'), + Some('ฏ'), // 0xa8-0xaf + Some('ฐ'), + Some('ฑ'), + Some('ฒ'), + Some('ณ'), + Some('ด'), + Some('ต'), + Some('ถ'), + Some('ท'), // 0xb0-0xb7 + Some('ธ'), + Some('น'), + Some('บ'), + Some('ป'), + Some('ผ'), + Some('ฝ'), + Some('พ'), + Some('ฟ'), // 0xb8-0xbf + Some('ภ'), + Some('ม'), + Some('ย'), + Some('ร'), + Some('ฤ'), + Some('ล'), + Some('ฦ'), + Some('ว'), // 0xc0-0xc7 + Some('ศ'), + Some('ษ'), + Some('ส'), + Some('ห'), + Some('ฬ'), + Some('อ'), + Some('ฮ'), + Some('ฯ'), // 0xc8-0xcf + Some('ะ'), + Some('ั'), + Some('า'), + Some('ำ'), + Some('ิ'), + Some('ี'), + Some('ึ'), + Some('ื'), // 0xd0-0xd7 + Some('ุ'), + Some('ู'), + Some('ฺ'), + None, + None, + None, + None, + Some('฿'), // 0xd8-0xdf + Some('เ'), + Some('แ'), + Some('โ'), + Some('ใ'), + Some('ไ'), + Some('ๅ'), + Some('ๆ'), + Some('็'), // 0xe0-0xe7 + Some('่'), + Some('้'), + Some('๊'), + Some('๋'), + Some('์'), + Some('ํ'), + Some('๎'), + Some('๏'), // 0xe8-0xef + Some('๐'), + Some('๑'), + Some('๒'), + Some('๓'), + Some('๔'), + Some('๕'), + Some('๖'), + Some('๗'), // 0xf0-0xf7 + Some('๘'), + Some('๙'), + Some('๚'), + Some('๛'), + None, + None, + None, + None, // 0xf8-0xff +]; + +/// Code page 1250, byte value to Unicode scalar. +pub(crate) const CP1250: [Option; 256] = [ + Some('\u{0000}'), + Some('\u{0001}'), + Some('\u{0002}'), + Some('\u{0003}'), + Some('\u{0004}'), + Some('\u{0005}'), + Some('\u{0006}'), + Some('\u{0007}'), // 0x00-0x07 + Some('\u{0008}'), + Some('\u{0009}'), + Some('\u{000A}'), + Some('\u{000B}'), + Some('\u{000C}'), + Some('\u{000D}'), + Some('\u{000E}'), + Some('\u{000F}'), // 0x08-0x0f + Some('\u{0010}'), + Some('\u{0011}'), + Some('\u{0012}'), + Some('\u{0013}'), + Some('\u{0014}'), + Some('\u{0015}'), + Some('\u{0016}'), + Some('\u{0017}'), // 0x10-0x17 + Some('\u{0018}'), + Some('\u{0019}'), + Some('\u{001A}'), + Some('\u{001B}'), + Some('\u{001C}'), + Some('\u{001D}'), + Some('\u{001E}'), + Some('\u{001F}'), // 0x18-0x1f + Some(' '), + Some('!'), + Some('"'), + Some('#'), + Some('$'), + Some('%'), + Some('&'), + Some('\u{0027}'), // 0x20-0x27 + Some('('), + Some(')'), + Some('*'), + Some('+'), + Some(','), + Some('-'), + Some('.'), + Some('/'), // 0x28-0x2f + Some('0'), + Some('1'), + Some('2'), + Some('3'), + Some('4'), + Some('5'), + Some('6'), + Some('7'), // 0x30-0x37 + Some('8'), + Some('9'), + Some(':'), + Some(';'), + Some('<'), + Some('='), + Some('>'), + Some('?'), // 0x38-0x3f + Some('@'), + Some('A'), + Some('B'), + Some('C'), + Some('D'), + Some('E'), + Some('F'), + Some('G'), // 0x40-0x47 + Some('H'), + Some('I'), + Some('J'), + Some('K'), + Some('L'), + Some('M'), + Some('N'), + Some('O'), // 0x48-0x4f + Some('P'), + Some('Q'), + Some('R'), + Some('S'), + Some('T'), + Some('U'), + Some('V'), + Some('W'), // 0x50-0x57 + Some('X'), + Some('Y'), + Some('Z'), + Some('['), + Some('\u{005C}'), + Some(']'), + Some('^'), + Some('_'), // 0x58-0x5f + Some('`'), + Some('a'), + Some('b'), + Some('c'), + Some('d'), + Some('e'), + Some('f'), + Some('g'), // 0x60-0x67 + Some('h'), + Some('i'), + Some('j'), + Some('k'), + Some('l'), + Some('m'), + Some('n'), + Some('o'), // 0x68-0x6f + Some('p'), + Some('q'), + Some('r'), + Some('s'), + Some('t'), + Some('u'), + Some('v'), + Some('w'), // 0x70-0x77 + Some('x'), + Some('y'), + Some('z'), + Some('{'), + Some('|'), + Some('}'), + Some('~'), + Some('\u{007F}'), // 0x78-0x7f + Some('€'), + None, + Some('‚'), + None, + Some('„'), + Some('…'), + Some('†'), + Some('‡'), // 0x80-0x87 + None, + Some('‰'), + Some('Š'), + Some('‹'), + Some('Ś'), + Some('Ť'), + Some('Ž'), + Some('Ź'), // 0x88-0x8f + None, + Some('‘'), + Some('’'), + Some('“'), + Some('”'), + Some('•'), + Some('–'), + Some('—'), // 0x90-0x97 + None, + Some('™'), + Some('š'), + Some('›'), + Some('ś'), + Some('ť'), + Some('ž'), + Some('ź'), // 0x98-0x9f + Some('\u{00A0}'), + Some('ˇ'), + Some('˘'), + Some('Ł'), + Some('¤'), + Some('Ą'), + Some('¦'), + Some('§'), // 0xa0-0xa7 + Some('¨'), + Some('©'), + Some('Ş'), + Some('«'), + Some('¬'), + Some('\u{00AD}'), + Some('®'), + Some('Ż'), // 0xa8-0xaf + Some('°'), + Some('±'), + Some('˛'), + Some('ł'), + Some('´'), + Some('µ'), + Some('¶'), + Some('·'), // 0xb0-0xb7 + Some('¸'), + Some('ą'), + Some('ş'), + Some('»'), + Some('Ľ'), + Some('˝'), + Some('ľ'), + Some('ż'), // 0xb8-0xbf + Some('Ŕ'), + Some('Á'), + Some('Â'), + Some('Ă'), + Some('Ä'), + Some('Ĺ'), + Some('Ć'), + Some('Ç'), // 0xc0-0xc7 + Some('Č'), + Some('É'), + Some('Ę'), + Some('Ë'), + Some('Ě'), + Some('Í'), + Some('Î'), + Some('Ď'), // 0xc8-0xcf + Some('Đ'), + Some('Ń'), + Some('Ň'), + Some('Ó'), + Some('Ô'), + Some('Ő'), + Some('Ö'), + Some('×'), // 0xd0-0xd7 + Some('Ř'), + Some('Ů'), + Some('Ú'), + Some('Ű'), + Some('Ü'), + Some('Ý'), + Some('Ţ'), + Some('ß'), // 0xd8-0xdf + Some('ŕ'), + Some('á'), + Some('â'), + Some('ă'), + Some('ä'), + Some('ĺ'), + Some('ć'), + Some('ç'), // 0xe0-0xe7 + Some('č'), + Some('é'), + Some('ę'), + Some('ë'), + Some('ě'), + Some('í'), + Some('î'), + Some('ď'), // 0xe8-0xef + Some('đ'), + Some('ń'), + Some('ň'), + Some('ó'), + Some('ô'), + Some('ő'), + Some('ö'), + Some('÷'), // 0xf0-0xf7 + Some('ř'), + Some('ů'), + Some('ú'), + Some('ű'), + Some('ü'), + Some('ý'), + Some('ţ'), + Some('˙'), // 0xf8-0xff +]; + +/// Code page 1251, byte value to Unicode scalar. +pub(crate) const CP1251: [Option; 256] = [ + Some('\u{0000}'), + Some('\u{0001}'), + Some('\u{0002}'), + Some('\u{0003}'), + Some('\u{0004}'), + Some('\u{0005}'), + Some('\u{0006}'), + Some('\u{0007}'), // 0x00-0x07 + Some('\u{0008}'), + Some('\u{0009}'), + Some('\u{000A}'), + Some('\u{000B}'), + Some('\u{000C}'), + Some('\u{000D}'), + Some('\u{000E}'), + Some('\u{000F}'), // 0x08-0x0f + Some('\u{0010}'), + Some('\u{0011}'), + Some('\u{0012}'), + Some('\u{0013}'), + Some('\u{0014}'), + Some('\u{0015}'), + Some('\u{0016}'), + Some('\u{0017}'), // 0x10-0x17 + Some('\u{0018}'), + Some('\u{0019}'), + Some('\u{001A}'), + Some('\u{001B}'), + Some('\u{001C}'), + Some('\u{001D}'), + Some('\u{001E}'), + Some('\u{001F}'), // 0x18-0x1f + Some(' '), + Some('!'), + Some('"'), + Some('#'), + Some('$'), + Some('%'), + Some('&'), + Some('\u{0027}'), // 0x20-0x27 + Some('('), + Some(')'), + Some('*'), + Some('+'), + Some(','), + Some('-'), + Some('.'), + Some('/'), // 0x28-0x2f + Some('0'), + Some('1'), + Some('2'), + Some('3'), + Some('4'), + Some('5'), + Some('6'), + Some('7'), // 0x30-0x37 + Some('8'), + Some('9'), + Some(':'), + Some(';'), + Some('<'), + Some('='), + Some('>'), + Some('?'), // 0x38-0x3f + Some('@'), + Some('A'), + Some('B'), + Some('C'), + Some('D'), + Some('E'), + Some('F'), + Some('G'), // 0x40-0x47 + Some('H'), + Some('I'), + Some('J'), + Some('K'), + Some('L'), + Some('M'), + Some('N'), + Some('O'), // 0x48-0x4f + Some('P'), + Some('Q'), + Some('R'), + Some('S'), + Some('T'), + Some('U'), + Some('V'), + Some('W'), // 0x50-0x57 + Some('X'), + Some('Y'), + Some('Z'), + Some('['), + Some('\u{005C}'), + Some(']'), + Some('^'), + Some('_'), // 0x58-0x5f + Some('`'), + Some('a'), + Some('b'), + Some('c'), + Some('d'), + Some('e'), + Some('f'), + Some('g'), // 0x60-0x67 + Some('h'), + Some('i'), + Some('j'), + Some('k'), + Some('l'), + Some('m'), + Some('n'), + Some('o'), // 0x68-0x6f + Some('p'), + Some('q'), + Some('r'), + Some('s'), + Some('t'), + Some('u'), + Some('v'), + Some('w'), // 0x70-0x77 + Some('x'), + Some('y'), + Some('z'), + Some('{'), + Some('|'), + Some('}'), + Some('~'), + Some('\u{007F}'), // 0x78-0x7f + Some('Ђ'), + Some('Ѓ'), + Some('‚'), + Some('ѓ'), + Some('„'), + Some('…'), + Some('†'), + Some('‡'), // 0x80-0x87 + Some('€'), + Some('‰'), + Some('Љ'), + Some('‹'), + Some('Њ'), + Some('Ќ'), + Some('Ћ'), + Some('Џ'), // 0x88-0x8f + Some('ђ'), + Some('‘'), + Some('’'), + Some('“'), + Some('”'), + Some('•'), + Some('–'), + Some('—'), // 0x90-0x97 + None, + Some('™'), + Some('љ'), + Some('›'), + Some('њ'), + Some('ќ'), + Some('ћ'), + Some('џ'), // 0x98-0x9f + Some('\u{00A0}'), + Some('Ў'), + Some('ў'), + Some('Ј'), + Some('¤'), + Some('Ґ'), + Some('¦'), + Some('§'), // 0xa0-0xa7 + Some('Ё'), + Some('©'), + Some('Є'), + Some('«'), + Some('¬'), + Some('\u{00AD}'), + Some('®'), + Some('Ї'), // 0xa8-0xaf + Some('°'), + Some('±'), + Some('І'), + Some('і'), + Some('ґ'), + Some('µ'), + Some('¶'), + Some('·'), // 0xb0-0xb7 + Some('ё'), + Some('№'), + Some('є'), + Some('»'), + Some('ј'), + Some('Ѕ'), + Some('ѕ'), + Some('ї'), // 0xb8-0xbf + Some('А'), + Some('Б'), + Some('В'), + Some('Г'), + Some('Д'), + Some('Е'), + Some('Ж'), + Some('З'), // 0xc0-0xc7 + Some('И'), + Some('Й'), + Some('К'), + Some('Л'), + Some('М'), + Some('Н'), + Some('О'), + Some('П'), // 0xc8-0xcf + Some('Р'), + Some('С'), + Some('Т'), + Some('У'), + Some('Ф'), + Some('Х'), + Some('Ц'), + Some('Ч'), // 0xd0-0xd7 + Some('Ш'), + Some('Щ'), + Some('Ъ'), + Some('Ы'), + Some('Ь'), + Some('Э'), + Some('Ю'), + Some('Я'), // 0xd8-0xdf + Some('а'), + Some('б'), + Some('в'), + Some('г'), + Some('д'), + Some('е'), + Some('ж'), + Some('з'), // 0xe0-0xe7 + Some('и'), + Some('й'), + Some('к'), + Some('л'), + Some('м'), + Some('н'), + Some('о'), + Some('п'), // 0xe8-0xef + Some('р'), + Some('с'), + Some('т'), + Some('у'), + Some('ф'), + Some('х'), + Some('ц'), + Some('ч'), // 0xf0-0xf7 + Some('ш'), + Some('щ'), + Some('ъ'), + Some('ы'), + Some('ь'), + Some('э'), + Some('ю'), + Some('я'), // 0xf8-0xff +]; + +/// Code page 1252, byte value to Unicode scalar. +pub(crate) const CP1252: [Option; 256] = [ + Some('\u{0000}'), + Some('\u{0001}'), + Some('\u{0002}'), + Some('\u{0003}'), + Some('\u{0004}'), + Some('\u{0005}'), + Some('\u{0006}'), + Some('\u{0007}'), // 0x00-0x07 + Some('\u{0008}'), + Some('\u{0009}'), + Some('\u{000A}'), + Some('\u{000B}'), + Some('\u{000C}'), + Some('\u{000D}'), + Some('\u{000E}'), + Some('\u{000F}'), // 0x08-0x0f + Some('\u{0010}'), + Some('\u{0011}'), + Some('\u{0012}'), + Some('\u{0013}'), + Some('\u{0014}'), + Some('\u{0015}'), + Some('\u{0016}'), + Some('\u{0017}'), // 0x10-0x17 + Some('\u{0018}'), + Some('\u{0019}'), + Some('\u{001A}'), + Some('\u{001B}'), + Some('\u{001C}'), + Some('\u{001D}'), + Some('\u{001E}'), + Some('\u{001F}'), // 0x18-0x1f + Some(' '), + Some('!'), + Some('"'), + Some('#'), + Some('$'), + Some('%'), + Some('&'), + Some('\u{0027}'), // 0x20-0x27 + Some('('), + Some(')'), + Some('*'), + Some('+'), + Some(','), + Some('-'), + Some('.'), + Some('/'), // 0x28-0x2f + Some('0'), + Some('1'), + Some('2'), + Some('3'), + Some('4'), + Some('5'), + Some('6'), + Some('7'), // 0x30-0x37 + Some('8'), + Some('9'), + Some(':'), + Some(';'), + Some('<'), + Some('='), + Some('>'), + Some('?'), // 0x38-0x3f + Some('@'), + Some('A'), + Some('B'), + Some('C'), + Some('D'), + Some('E'), + Some('F'), + Some('G'), // 0x40-0x47 + Some('H'), + Some('I'), + Some('J'), + Some('K'), + Some('L'), + Some('M'), + Some('N'), + Some('O'), // 0x48-0x4f + Some('P'), + Some('Q'), + Some('R'), + Some('S'), + Some('T'), + Some('U'), + Some('V'), + Some('W'), // 0x50-0x57 + Some('X'), + Some('Y'), + Some('Z'), + Some('['), + Some('\u{005C}'), + Some(']'), + Some('^'), + Some('_'), // 0x58-0x5f + Some('`'), + Some('a'), + Some('b'), + Some('c'), + Some('d'), + Some('e'), + Some('f'), + Some('g'), // 0x60-0x67 + Some('h'), + Some('i'), + Some('j'), + Some('k'), + Some('l'), + Some('m'), + Some('n'), + Some('o'), // 0x68-0x6f + Some('p'), + Some('q'), + Some('r'), + Some('s'), + Some('t'), + Some('u'), + Some('v'), + Some('w'), // 0x70-0x77 + Some('x'), + Some('y'), + Some('z'), + Some('{'), + Some('|'), + Some('}'), + Some('~'), + Some('\u{007F}'), // 0x78-0x7f + Some('€'), + None, + Some('‚'), + Some('ƒ'), + Some('„'), + Some('…'), + Some('†'), + Some('‡'), // 0x80-0x87 + Some('ˆ'), + Some('‰'), + Some('Š'), + Some('‹'), + Some('Œ'), + None, + Some('Ž'), + None, // 0x88-0x8f + None, + Some('‘'), + Some('’'), + Some('“'), + Some('”'), + Some('•'), + Some('–'), + Some('—'), // 0x90-0x97 + Some('˜'), + Some('™'), + Some('š'), + Some('›'), + Some('œ'), + None, + Some('ž'), + Some('Ÿ'), // 0x98-0x9f + Some('\u{00A0}'), + Some('¡'), + Some('¢'), + Some('£'), + Some('¤'), + Some('¥'), + Some('¦'), + Some('§'), // 0xa0-0xa7 + Some('¨'), + Some('©'), + Some('ª'), + Some('«'), + Some('¬'), + Some('\u{00AD}'), + Some('®'), + Some('¯'), // 0xa8-0xaf + Some('°'), + Some('±'), + Some('²'), + Some('³'), + Some('´'), + Some('µ'), + Some('¶'), + Some('·'), // 0xb0-0xb7 + Some('¸'), + Some('¹'), + Some('º'), + Some('»'), + Some('¼'), + Some('½'), + Some('¾'), + Some('¿'), // 0xb8-0xbf + Some('À'), + Some('Á'), + Some('Â'), + Some('Ã'), + Some('Ä'), + Some('Å'), + Some('Æ'), + Some('Ç'), // 0xc0-0xc7 + Some('È'), + Some('É'), + Some('Ê'), + Some('Ë'), + Some('Ì'), + Some('Í'), + Some('Î'), + Some('Ï'), // 0xc8-0xcf + Some('Ð'), + Some('Ñ'), + Some('Ò'), + Some('Ó'), + Some('Ô'), + Some('Õ'), + Some('Ö'), + Some('×'), // 0xd0-0xd7 + Some('Ø'), + Some('Ù'), + Some('Ú'), + Some('Û'), + Some('Ü'), + Some('Ý'), + Some('Þ'), + Some('ß'), // 0xd8-0xdf + Some('à'), + Some('á'), + Some('â'), + Some('ã'), + Some('ä'), + Some('å'), + Some('æ'), + Some('ç'), // 0xe0-0xe7 + Some('è'), + Some('é'), + Some('ê'), + Some('ë'), + Some('ì'), + Some('í'), + Some('î'), + Some('ï'), // 0xe8-0xef + Some('ð'), + Some('ñ'), + Some('ò'), + Some('ó'), + Some('ô'), + Some('õ'), + Some('ö'), + Some('÷'), // 0xf0-0xf7 + Some('ø'), + Some('ù'), + Some('ú'), + Some('û'), + Some('ü'), + Some('ý'), + Some('þ'), + Some('ÿ'), // 0xf8-0xff +]; + +/// Code page 1253, byte value to Unicode scalar. +pub(crate) const CP1253: [Option; 256] = [ + Some('\u{0000}'), + Some('\u{0001}'), + Some('\u{0002}'), + Some('\u{0003}'), + Some('\u{0004}'), + Some('\u{0005}'), + Some('\u{0006}'), + Some('\u{0007}'), // 0x00-0x07 + Some('\u{0008}'), + Some('\u{0009}'), + Some('\u{000A}'), + Some('\u{000B}'), + Some('\u{000C}'), + Some('\u{000D}'), + Some('\u{000E}'), + Some('\u{000F}'), // 0x08-0x0f + Some('\u{0010}'), + Some('\u{0011}'), + Some('\u{0012}'), + Some('\u{0013}'), + Some('\u{0014}'), + Some('\u{0015}'), + Some('\u{0016}'), + Some('\u{0017}'), // 0x10-0x17 + Some('\u{0018}'), + Some('\u{0019}'), + Some('\u{001A}'), + Some('\u{001B}'), + Some('\u{001C}'), + Some('\u{001D}'), + Some('\u{001E}'), + Some('\u{001F}'), // 0x18-0x1f + Some(' '), + Some('!'), + Some('"'), + Some('#'), + Some('$'), + Some('%'), + Some('&'), + Some('\u{0027}'), // 0x20-0x27 + Some('('), + Some(')'), + Some('*'), + Some('+'), + Some(','), + Some('-'), + Some('.'), + Some('/'), // 0x28-0x2f + Some('0'), + Some('1'), + Some('2'), + Some('3'), + Some('4'), + Some('5'), + Some('6'), + Some('7'), // 0x30-0x37 + Some('8'), + Some('9'), + Some(':'), + Some(';'), + Some('<'), + Some('='), + Some('>'), + Some('?'), // 0x38-0x3f + Some('@'), + Some('A'), + Some('B'), + Some('C'), + Some('D'), + Some('E'), + Some('F'), + Some('G'), // 0x40-0x47 + Some('H'), + Some('I'), + Some('J'), + Some('K'), + Some('L'), + Some('M'), + Some('N'), + Some('O'), // 0x48-0x4f + Some('P'), + Some('Q'), + Some('R'), + Some('S'), + Some('T'), + Some('U'), + Some('V'), + Some('W'), // 0x50-0x57 + Some('X'), + Some('Y'), + Some('Z'), + Some('['), + Some('\u{005C}'), + Some(']'), + Some('^'), + Some('_'), // 0x58-0x5f + Some('`'), + Some('a'), + Some('b'), + Some('c'), + Some('d'), + Some('e'), + Some('f'), + Some('g'), // 0x60-0x67 + Some('h'), + Some('i'), + Some('j'), + Some('k'), + Some('l'), + Some('m'), + Some('n'), + Some('o'), // 0x68-0x6f + Some('p'), + Some('q'), + Some('r'), + Some('s'), + Some('t'), + Some('u'), + Some('v'), + Some('w'), // 0x70-0x77 + Some('x'), + Some('y'), + Some('z'), + Some('{'), + Some('|'), + Some('}'), + Some('~'), + Some('\u{007F}'), // 0x78-0x7f + Some('€'), + None, + Some('‚'), + Some('ƒ'), + Some('„'), + Some('…'), + Some('†'), + Some('‡'), // 0x80-0x87 + None, + Some('‰'), + None, + Some('‹'), + None, + None, + None, + None, // 0x88-0x8f + None, + Some('‘'), + Some('’'), + Some('“'), + Some('”'), + Some('•'), + Some('–'), + Some('—'), // 0x90-0x97 + None, + Some('™'), + None, + Some('›'), + None, + None, + None, + None, // 0x98-0x9f + Some('\u{00A0}'), + Some('΅'), + Some('Ά'), + Some('£'), + Some('¤'), + Some('¥'), + Some('¦'), + Some('§'), // 0xa0-0xa7 + Some('¨'), + Some('©'), + None, + Some('«'), + Some('¬'), + Some('\u{00AD}'), + Some('®'), + Some('―'), // 0xa8-0xaf + Some('°'), + Some('±'), + Some('²'), + Some('³'), + Some('΄'), + Some('µ'), + Some('¶'), + Some('·'), // 0xb0-0xb7 + Some('Έ'), + Some('Ή'), + Some('Ί'), + Some('»'), + Some('Ό'), + Some('½'), + Some('Ύ'), + Some('Ώ'), // 0xb8-0xbf + Some('ΐ'), + Some('Α'), + Some('Β'), + Some('Γ'), + Some('Δ'), + Some('Ε'), + Some('Ζ'), + Some('Η'), // 0xc0-0xc7 + Some('Θ'), + Some('Ι'), + Some('Κ'), + Some('Λ'), + Some('Μ'), + Some('Ν'), + Some('Ξ'), + Some('Ο'), // 0xc8-0xcf + Some('Π'), + Some('Ρ'), + None, + Some('Σ'), + Some('Τ'), + Some('Υ'), + Some('Φ'), + Some('Χ'), // 0xd0-0xd7 + Some('Ψ'), + Some('Ω'), + Some('Ϊ'), + Some('Ϋ'), + Some('ά'), + Some('έ'), + Some('ή'), + Some('ί'), // 0xd8-0xdf + Some('ΰ'), + Some('α'), + Some('β'), + Some('γ'), + Some('δ'), + Some('ε'), + Some('ζ'), + Some('η'), // 0xe0-0xe7 + Some('θ'), + Some('ι'), + Some('κ'), + Some('λ'), + Some('μ'), + Some('ν'), + Some('ξ'), + Some('ο'), // 0xe8-0xef + Some('π'), + Some('ρ'), + Some('ς'), + Some('σ'), + Some('τ'), + Some('υ'), + Some('φ'), + Some('χ'), // 0xf0-0xf7 + Some('ψ'), + Some('ω'), + Some('ϊ'), + Some('ϋ'), + Some('ό'), + Some('ύ'), + Some('ώ'), + None, // 0xf8-0xff +]; + +/// Code page 1254, byte value to Unicode scalar. +pub(crate) const CP1254: [Option; 256] = [ + Some('\u{0000}'), + Some('\u{0001}'), + Some('\u{0002}'), + Some('\u{0003}'), + Some('\u{0004}'), + Some('\u{0005}'), + Some('\u{0006}'), + Some('\u{0007}'), // 0x00-0x07 + Some('\u{0008}'), + Some('\u{0009}'), + Some('\u{000A}'), + Some('\u{000B}'), + Some('\u{000C}'), + Some('\u{000D}'), + Some('\u{000E}'), + Some('\u{000F}'), // 0x08-0x0f + Some('\u{0010}'), + Some('\u{0011}'), + Some('\u{0012}'), + Some('\u{0013}'), + Some('\u{0014}'), + Some('\u{0015}'), + Some('\u{0016}'), + Some('\u{0017}'), // 0x10-0x17 + Some('\u{0018}'), + Some('\u{0019}'), + Some('\u{001A}'), + Some('\u{001B}'), + Some('\u{001C}'), + Some('\u{001D}'), + Some('\u{001E}'), + Some('\u{001F}'), // 0x18-0x1f + Some(' '), + Some('!'), + Some('"'), + Some('#'), + Some('$'), + Some('%'), + Some('&'), + Some('\u{0027}'), // 0x20-0x27 + Some('('), + Some(')'), + Some('*'), + Some('+'), + Some(','), + Some('-'), + Some('.'), + Some('/'), // 0x28-0x2f + Some('0'), + Some('1'), + Some('2'), + Some('3'), + Some('4'), + Some('5'), + Some('6'), + Some('7'), // 0x30-0x37 + Some('8'), + Some('9'), + Some(':'), + Some(';'), + Some('<'), + Some('='), + Some('>'), + Some('?'), // 0x38-0x3f + Some('@'), + Some('A'), + Some('B'), + Some('C'), + Some('D'), + Some('E'), + Some('F'), + Some('G'), // 0x40-0x47 + Some('H'), + Some('I'), + Some('J'), + Some('K'), + Some('L'), + Some('M'), + Some('N'), + Some('O'), // 0x48-0x4f + Some('P'), + Some('Q'), + Some('R'), + Some('S'), + Some('T'), + Some('U'), + Some('V'), + Some('W'), // 0x50-0x57 + Some('X'), + Some('Y'), + Some('Z'), + Some('['), + Some('\u{005C}'), + Some(']'), + Some('^'), + Some('_'), // 0x58-0x5f + Some('`'), + Some('a'), + Some('b'), + Some('c'), + Some('d'), + Some('e'), + Some('f'), + Some('g'), // 0x60-0x67 + Some('h'), + Some('i'), + Some('j'), + Some('k'), + Some('l'), + Some('m'), + Some('n'), + Some('o'), // 0x68-0x6f + Some('p'), + Some('q'), + Some('r'), + Some('s'), + Some('t'), + Some('u'), + Some('v'), + Some('w'), // 0x70-0x77 + Some('x'), + Some('y'), + Some('z'), + Some('{'), + Some('|'), + Some('}'), + Some('~'), + Some('\u{007F}'), // 0x78-0x7f + Some('€'), + None, + Some('‚'), + Some('ƒ'), + Some('„'), + Some('…'), + Some('†'), + Some('‡'), // 0x80-0x87 + Some('ˆ'), + Some('‰'), + Some('Š'), + Some('‹'), + Some('Œ'), + None, + None, + None, // 0x88-0x8f + None, + Some('‘'), + Some('’'), + Some('“'), + Some('”'), + Some('•'), + Some('–'), + Some('—'), // 0x90-0x97 + Some('˜'), + Some('™'), + Some('š'), + Some('›'), + Some('œ'), + None, + None, + Some('Ÿ'), // 0x98-0x9f + Some('\u{00A0}'), + Some('¡'), + Some('¢'), + Some('£'), + Some('¤'), + Some('¥'), + Some('¦'), + Some('§'), // 0xa0-0xa7 + Some('¨'), + Some('©'), + Some('ª'), + Some('«'), + Some('¬'), + Some('\u{00AD}'), + Some('®'), + Some('¯'), // 0xa8-0xaf + Some('°'), + Some('±'), + Some('²'), + Some('³'), + Some('´'), + Some('µ'), + Some('¶'), + Some('·'), // 0xb0-0xb7 + Some('¸'), + Some('¹'), + Some('º'), + Some('»'), + Some('¼'), + Some('½'), + Some('¾'), + Some('¿'), // 0xb8-0xbf + Some('À'), + Some('Á'), + Some('Â'), + Some('Ã'), + Some('Ä'), + Some('Å'), + Some('Æ'), + Some('Ç'), // 0xc0-0xc7 + Some('È'), + Some('É'), + Some('Ê'), + Some('Ë'), + Some('Ì'), + Some('Í'), + Some('Î'), + Some('Ï'), // 0xc8-0xcf + Some('Ğ'), + Some('Ñ'), + Some('Ò'), + Some('Ó'), + Some('Ô'), + Some('Õ'), + Some('Ö'), + Some('×'), // 0xd0-0xd7 + Some('Ø'), + Some('Ù'), + Some('Ú'), + Some('Û'), + Some('Ü'), + Some('İ'), + Some('Ş'), + Some('ß'), // 0xd8-0xdf + Some('à'), + Some('á'), + Some('â'), + Some('ã'), + Some('ä'), + Some('å'), + Some('æ'), + Some('ç'), // 0xe0-0xe7 + Some('è'), + Some('é'), + Some('ê'), + Some('ë'), + Some('ì'), + Some('í'), + Some('î'), + Some('ï'), // 0xe8-0xef + Some('ğ'), + Some('ñ'), + Some('ò'), + Some('ó'), + Some('ô'), + Some('õ'), + Some('ö'), + Some('÷'), // 0xf0-0xf7 + Some('ø'), + Some('ù'), + Some('ú'), + Some('û'), + Some('ü'), + Some('ı'), + Some('ş'), + Some('ÿ'), // 0xf8-0xff +]; + +/// Code page 1255, byte value to Unicode scalar. +pub(crate) const CP1255: [Option; 256] = [ + Some('\u{0000}'), + Some('\u{0001}'), + Some('\u{0002}'), + Some('\u{0003}'), + Some('\u{0004}'), + Some('\u{0005}'), + Some('\u{0006}'), + Some('\u{0007}'), // 0x00-0x07 + Some('\u{0008}'), + Some('\u{0009}'), + Some('\u{000A}'), + Some('\u{000B}'), + Some('\u{000C}'), + Some('\u{000D}'), + Some('\u{000E}'), + Some('\u{000F}'), // 0x08-0x0f + Some('\u{0010}'), + Some('\u{0011}'), + Some('\u{0012}'), + Some('\u{0013}'), + Some('\u{0014}'), + Some('\u{0015}'), + Some('\u{0016}'), + Some('\u{0017}'), // 0x10-0x17 + Some('\u{0018}'), + Some('\u{0019}'), + Some('\u{001A}'), + Some('\u{001B}'), + Some('\u{001C}'), + Some('\u{001D}'), + Some('\u{001E}'), + Some('\u{001F}'), // 0x18-0x1f + Some(' '), + Some('!'), + Some('"'), + Some('#'), + Some('$'), + Some('%'), + Some('&'), + Some('\u{0027}'), // 0x20-0x27 + Some('('), + Some(')'), + Some('*'), + Some('+'), + Some(','), + Some('-'), + Some('.'), + Some('/'), // 0x28-0x2f + Some('0'), + Some('1'), + Some('2'), + Some('3'), + Some('4'), + Some('5'), + Some('6'), + Some('7'), // 0x30-0x37 + Some('8'), + Some('9'), + Some(':'), + Some(';'), + Some('<'), + Some('='), + Some('>'), + Some('?'), // 0x38-0x3f + Some('@'), + Some('A'), + Some('B'), + Some('C'), + Some('D'), + Some('E'), + Some('F'), + Some('G'), // 0x40-0x47 + Some('H'), + Some('I'), + Some('J'), + Some('K'), + Some('L'), + Some('M'), + Some('N'), + Some('O'), // 0x48-0x4f + Some('P'), + Some('Q'), + Some('R'), + Some('S'), + Some('T'), + Some('U'), + Some('V'), + Some('W'), // 0x50-0x57 + Some('X'), + Some('Y'), + Some('Z'), + Some('['), + Some('\u{005C}'), + Some(']'), + Some('^'), + Some('_'), // 0x58-0x5f + Some('`'), + Some('a'), + Some('b'), + Some('c'), + Some('d'), + Some('e'), + Some('f'), + Some('g'), // 0x60-0x67 + Some('h'), + Some('i'), + Some('j'), + Some('k'), + Some('l'), + Some('m'), + Some('n'), + Some('o'), // 0x68-0x6f + Some('p'), + Some('q'), + Some('r'), + Some('s'), + Some('t'), + Some('u'), + Some('v'), + Some('w'), // 0x70-0x77 + Some('x'), + Some('y'), + Some('z'), + Some('{'), + Some('|'), + Some('}'), + Some('~'), + Some('\u{007F}'), // 0x78-0x7f + Some('€'), + None, + Some('‚'), + Some('ƒ'), + Some('„'), + Some('…'), + Some('†'), + Some('‡'), // 0x80-0x87 + Some('ˆ'), + Some('‰'), + None, + Some('‹'), + None, + None, + None, + None, // 0x88-0x8f + None, + Some('‘'), + Some('’'), + Some('“'), + Some('”'), + Some('•'), + Some('–'), + Some('—'), // 0x90-0x97 + Some('˜'), + Some('™'), + None, + Some('›'), + None, + None, + None, + None, // 0x98-0x9f + Some('\u{00A0}'), + Some('¡'), + Some('¢'), + Some('£'), + Some('₪'), + Some('¥'), + Some('¦'), + Some('§'), // 0xa0-0xa7 + Some('¨'), + Some('©'), + Some('×'), + Some('«'), + Some('¬'), + Some('\u{00AD}'), + Some('®'), + Some('¯'), // 0xa8-0xaf + Some('°'), + Some('±'), + Some('²'), + Some('³'), + Some('´'), + Some('µ'), + Some('¶'), + Some('·'), // 0xb0-0xb7 + Some('¸'), + Some('¹'), + Some('÷'), + Some('»'), + Some('¼'), + Some('½'), + Some('¾'), + Some('¿'), // 0xb8-0xbf + Some('ְ'), + Some('ֱ'), + Some('ֲ'), + Some('ֳ'), + Some('ִ'), + Some('ֵ'), + Some('ֶ'), + Some('ַ'), // 0xc0-0xc7 + Some('ָ'), + Some('ֹ'), + None, + Some('ֻ'), + Some('ּ'), + Some('ֽ'), + Some('־'), + Some('ֿ'), // 0xc8-0xcf + Some('׀'), + Some('ׁ'), + Some('ׂ'), + Some('׃'), + Some('װ'), + Some('ױ'), + Some('ײ'), + Some('׳'), // 0xd0-0xd7 + Some('״'), + None, + None, + None, + None, + None, + None, + None, // 0xd8-0xdf + Some('א'), + Some('ב'), + Some('ג'), + Some('ד'), + Some('ה'), + Some('ו'), + Some('ז'), + Some('ח'), // 0xe0-0xe7 + Some('ט'), + Some('י'), + Some('ך'), + Some('כ'), + Some('ל'), + Some('ם'), + Some('מ'), + Some('ן'), // 0xe8-0xef + Some('נ'), + Some('ס'), + Some('ע'), + Some('ף'), + Some('פ'), + Some('ץ'), + Some('צ'), + Some('ק'), // 0xf0-0xf7 + Some('ר'), + Some('ש'), + Some('ת'), + None, + None, + Some('\u{200E}'), + Some('\u{200F}'), + None, // 0xf8-0xff +]; + +/// Code page 1256, byte value to Unicode scalar. +pub(crate) const CP1256: [Option; 256] = [ + Some('\u{0000}'), + Some('\u{0001}'), + Some('\u{0002}'), + Some('\u{0003}'), + Some('\u{0004}'), + Some('\u{0005}'), + Some('\u{0006}'), + Some('\u{0007}'), // 0x00-0x07 + Some('\u{0008}'), + Some('\u{0009}'), + Some('\u{000A}'), + Some('\u{000B}'), + Some('\u{000C}'), + Some('\u{000D}'), + Some('\u{000E}'), + Some('\u{000F}'), // 0x08-0x0f + Some('\u{0010}'), + Some('\u{0011}'), + Some('\u{0012}'), + Some('\u{0013}'), + Some('\u{0014}'), + Some('\u{0015}'), + Some('\u{0016}'), + Some('\u{0017}'), // 0x10-0x17 + Some('\u{0018}'), + Some('\u{0019}'), + Some('\u{001A}'), + Some('\u{001B}'), + Some('\u{001C}'), + Some('\u{001D}'), + Some('\u{001E}'), + Some('\u{001F}'), // 0x18-0x1f + Some(' '), + Some('!'), + Some('"'), + Some('#'), + Some('$'), + Some('%'), + Some('&'), + Some('\u{0027}'), // 0x20-0x27 + Some('('), + Some(')'), + Some('*'), + Some('+'), + Some(','), + Some('-'), + Some('.'), + Some('/'), // 0x28-0x2f + Some('0'), + Some('1'), + Some('2'), + Some('3'), + Some('4'), + Some('5'), + Some('6'), + Some('7'), // 0x30-0x37 + Some('8'), + Some('9'), + Some(':'), + Some(';'), + Some('<'), + Some('='), + Some('>'), + Some('?'), // 0x38-0x3f + Some('@'), + Some('A'), + Some('B'), + Some('C'), + Some('D'), + Some('E'), + Some('F'), + Some('G'), // 0x40-0x47 + Some('H'), + Some('I'), + Some('J'), + Some('K'), + Some('L'), + Some('M'), + Some('N'), + Some('O'), // 0x48-0x4f + Some('P'), + Some('Q'), + Some('R'), + Some('S'), + Some('T'), + Some('U'), + Some('V'), + Some('W'), // 0x50-0x57 + Some('X'), + Some('Y'), + Some('Z'), + Some('['), + Some('\u{005C}'), + Some(']'), + Some('^'), + Some('_'), // 0x58-0x5f + Some('`'), + Some('a'), + Some('b'), + Some('c'), + Some('d'), + Some('e'), + Some('f'), + Some('g'), // 0x60-0x67 + Some('h'), + Some('i'), + Some('j'), + Some('k'), + Some('l'), + Some('m'), + Some('n'), + Some('o'), // 0x68-0x6f + Some('p'), + Some('q'), + Some('r'), + Some('s'), + Some('t'), + Some('u'), + Some('v'), + Some('w'), // 0x70-0x77 + Some('x'), + Some('y'), + Some('z'), + Some('{'), + Some('|'), + Some('}'), + Some('~'), + Some('\u{007F}'), // 0x78-0x7f + Some('€'), + Some('پ'), + Some('‚'), + Some('ƒ'), + Some('„'), + Some('…'), + Some('†'), + Some('‡'), // 0x80-0x87 + Some('ˆ'), + Some('‰'), + Some('ٹ'), + Some('‹'), + Some('Œ'), + Some('چ'), + Some('ژ'), + Some('ڈ'), // 0x88-0x8f + Some('گ'), + Some('‘'), + Some('’'), + Some('“'), + Some('”'), + Some('•'), + Some('–'), + Some('—'), // 0x90-0x97 + Some('ک'), + Some('™'), + Some('ڑ'), + Some('›'), + Some('œ'), + Some('\u{200C}'), + Some('\u{200D}'), + Some('ں'), // 0x98-0x9f + Some('\u{00A0}'), + Some('،'), + Some('¢'), + Some('£'), + Some('¤'), + Some('¥'), + Some('¦'), + Some('§'), // 0xa0-0xa7 + Some('¨'), + Some('©'), + Some('ھ'), + Some('«'), + Some('¬'), + Some('\u{00AD}'), + Some('®'), + Some('¯'), // 0xa8-0xaf + Some('°'), + Some('±'), + Some('²'), + Some('³'), + Some('´'), + Some('µ'), + Some('¶'), + Some('·'), // 0xb0-0xb7 + Some('¸'), + Some('¹'), + Some('؛'), + Some('»'), + Some('¼'), + Some('½'), + Some('¾'), + Some('؟'), // 0xb8-0xbf + Some('ہ'), + Some('ء'), + Some('آ'), + Some('أ'), + Some('ؤ'), + Some('إ'), + Some('ئ'), + Some('ا'), // 0xc0-0xc7 + Some('ب'), + Some('ة'), + Some('ت'), + Some('ث'), + Some('ج'), + Some('ح'), + Some('خ'), + Some('د'), // 0xc8-0xcf + Some('ذ'), + Some('ر'), + Some('ز'), + Some('س'), + Some('ش'), + Some('ص'), + Some('ض'), + Some('×'), // 0xd0-0xd7 + Some('ط'), + Some('ظ'), + Some('ع'), + Some('غ'), + Some('ـ'), + Some('ف'), + Some('ق'), + Some('ك'), // 0xd8-0xdf + Some('à'), + Some('ل'), + Some('â'), + Some('م'), + Some('ن'), + Some('ه'), + Some('و'), + Some('ç'), // 0xe0-0xe7 + Some('è'), + Some('é'), + Some('ê'), + Some('ë'), + Some('ى'), + Some('ي'), + Some('î'), + Some('ï'), // 0xe8-0xef + Some('ً'), + Some('ٌ'), + Some('ٍ'), + Some('َ'), + Some('ô'), + Some('ُ'), + Some('ِ'), + Some('÷'), // 0xf0-0xf7 + Some('ّ'), + Some('ù'), + Some('ْ'), + Some('û'), + Some('ü'), + Some('\u{200E}'), + Some('\u{200F}'), + Some('ے'), // 0xf8-0xff +]; + +/// Code page 1257, byte value to Unicode scalar. +pub(crate) const CP1257: [Option; 256] = [ + Some('\u{0000}'), + Some('\u{0001}'), + Some('\u{0002}'), + Some('\u{0003}'), + Some('\u{0004}'), + Some('\u{0005}'), + Some('\u{0006}'), + Some('\u{0007}'), // 0x00-0x07 + Some('\u{0008}'), + Some('\u{0009}'), + Some('\u{000A}'), + Some('\u{000B}'), + Some('\u{000C}'), + Some('\u{000D}'), + Some('\u{000E}'), + Some('\u{000F}'), // 0x08-0x0f + Some('\u{0010}'), + Some('\u{0011}'), + Some('\u{0012}'), + Some('\u{0013}'), + Some('\u{0014}'), + Some('\u{0015}'), + Some('\u{0016}'), + Some('\u{0017}'), // 0x10-0x17 + Some('\u{0018}'), + Some('\u{0019}'), + Some('\u{001A}'), + Some('\u{001B}'), + Some('\u{001C}'), + Some('\u{001D}'), + Some('\u{001E}'), + Some('\u{001F}'), // 0x18-0x1f + Some(' '), + Some('!'), + Some('"'), + Some('#'), + Some('$'), + Some('%'), + Some('&'), + Some('\u{0027}'), // 0x20-0x27 + Some('('), + Some(')'), + Some('*'), + Some('+'), + Some(','), + Some('-'), + Some('.'), + Some('/'), // 0x28-0x2f + Some('0'), + Some('1'), + Some('2'), + Some('3'), + Some('4'), + Some('5'), + Some('6'), + Some('7'), // 0x30-0x37 + Some('8'), + Some('9'), + Some(':'), + Some(';'), + Some('<'), + Some('='), + Some('>'), + Some('?'), // 0x38-0x3f + Some('@'), + Some('A'), + Some('B'), + Some('C'), + Some('D'), + Some('E'), + Some('F'), + Some('G'), // 0x40-0x47 + Some('H'), + Some('I'), + Some('J'), + Some('K'), + Some('L'), + Some('M'), + Some('N'), + Some('O'), // 0x48-0x4f + Some('P'), + Some('Q'), + Some('R'), + Some('S'), + Some('T'), + Some('U'), + Some('V'), + Some('W'), // 0x50-0x57 + Some('X'), + Some('Y'), + Some('Z'), + Some('['), + Some('\u{005C}'), + Some(']'), + Some('^'), + Some('_'), // 0x58-0x5f + Some('`'), + Some('a'), + Some('b'), + Some('c'), + Some('d'), + Some('e'), + Some('f'), + Some('g'), // 0x60-0x67 + Some('h'), + Some('i'), + Some('j'), + Some('k'), + Some('l'), + Some('m'), + Some('n'), + Some('o'), // 0x68-0x6f + Some('p'), + Some('q'), + Some('r'), + Some('s'), + Some('t'), + Some('u'), + Some('v'), + Some('w'), // 0x70-0x77 + Some('x'), + Some('y'), + Some('z'), + Some('{'), + Some('|'), + Some('}'), + Some('~'), + Some('\u{007F}'), // 0x78-0x7f + Some('€'), + None, + Some('‚'), + None, + Some('„'), + Some('…'), + Some('†'), + Some('‡'), // 0x80-0x87 + None, + Some('‰'), + None, + Some('‹'), + None, + Some('¨'), + Some('ˇ'), + Some('¸'), // 0x88-0x8f + None, + Some('‘'), + Some('’'), + Some('“'), + Some('”'), + Some('•'), + Some('–'), + Some('—'), // 0x90-0x97 + None, + Some('™'), + None, + Some('›'), + None, + Some('¯'), + Some('˛'), + None, // 0x98-0x9f + Some('\u{00A0}'), + None, + Some('¢'), + Some('£'), + Some('¤'), + None, + Some('¦'), + Some('§'), // 0xa0-0xa7 + Some('Ø'), + Some('©'), + Some('Ŗ'), + Some('«'), + Some('¬'), + Some('\u{00AD}'), + Some('®'), + Some('Æ'), // 0xa8-0xaf + Some('°'), + Some('±'), + Some('²'), + Some('³'), + Some('´'), + Some('µ'), + Some('¶'), + Some('·'), // 0xb0-0xb7 + Some('ø'), + Some('¹'), + Some('ŗ'), + Some('»'), + Some('¼'), + Some('½'), + Some('¾'), + Some('æ'), // 0xb8-0xbf + Some('Ą'), + Some('Į'), + Some('Ā'), + Some('Ć'), + Some('Ä'), + Some('Å'), + Some('Ę'), + Some('Ē'), // 0xc0-0xc7 + Some('Č'), + Some('É'), + Some('Ź'), + Some('Ė'), + Some('Ģ'), + Some('Ķ'), + Some('Ī'), + Some('Ļ'), // 0xc8-0xcf + Some('Š'), + Some('Ń'), + Some('Ņ'), + Some('Ó'), + Some('Ō'), + Some('Õ'), + Some('Ö'), + Some('×'), // 0xd0-0xd7 + Some('Ų'), + Some('Ł'), + Some('Ś'), + Some('Ū'), + Some('Ü'), + Some('Ż'), + Some('Ž'), + Some('ß'), // 0xd8-0xdf + Some('ą'), + Some('į'), + Some('ā'), + Some('ć'), + Some('ä'), + Some('å'), + Some('ę'), + Some('ē'), // 0xe0-0xe7 + Some('č'), + Some('é'), + Some('ź'), + Some('ė'), + Some('ģ'), + Some('ķ'), + Some('ī'), + Some('ļ'), // 0xe8-0xef + Some('š'), + Some('ń'), + Some('ņ'), + Some('ó'), + Some('ō'), + Some('õ'), + Some('ö'), + Some('÷'), // 0xf0-0xf7 + Some('ų'), + Some('ł'), + Some('ś'), + Some('ū'), + Some('ü'), + Some('ż'), + Some('ž'), + Some('˙'), // 0xf8-0xff +]; + +/// Code page 1258, byte value to Unicode scalar. +pub(crate) const CP1258: [Option; 256] = [ + Some('\u{0000}'), + Some('\u{0001}'), + Some('\u{0002}'), + Some('\u{0003}'), + Some('\u{0004}'), + Some('\u{0005}'), + Some('\u{0006}'), + Some('\u{0007}'), // 0x00-0x07 + Some('\u{0008}'), + Some('\u{0009}'), + Some('\u{000A}'), + Some('\u{000B}'), + Some('\u{000C}'), + Some('\u{000D}'), + Some('\u{000E}'), + Some('\u{000F}'), // 0x08-0x0f + Some('\u{0010}'), + Some('\u{0011}'), + Some('\u{0012}'), + Some('\u{0013}'), + Some('\u{0014}'), + Some('\u{0015}'), + Some('\u{0016}'), + Some('\u{0017}'), // 0x10-0x17 + Some('\u{0018}'), + Some('\u{0019}'), + Some('\u{001A}'), + Some('\u{001B}'), + Some('\u{001C}'), + Some('\u{001D}'), + Some('\u{001E}'), + Some('\u{001F}'), // 0x18-0x1f + Some(' '), + Some('!'), + Some('"'), + Some('#'), + Some('$'), + Some('%'), + Some('&'), + Some('\u{0027}'), // 0x20-0x27 + Some('('), + Some(')'), + Some('*'), + Some('+'), + Some(','), + Some('-'), + Some('.'), + Some('/'), // 0x28-0x2f + Some('0'), + Some('1'), + Some('2'), + Some('3'), + Some('4'), + Some('5'), + Some('6'), + Some('7'), // 0x30-0x37 + Some('8'), + Some('9'), + Some(':'), + Some(';'), + Some('<'), + Some('='), + Some('>'), + Some('?'), // 0x38-0x3f + Some('@'), + Some('A'), + Some('B'), + Some('C'), + Some('D'), + Some('E'), + Some('F'), + Some('G'), // 0x40-0x47 + Some('H'), + Some('I'), + Some('J'), + Some('K'), + Some('L'), + Some('M'), + Some('N'), + Some('O'), // 0x48-0x4f + Some('P'), + Some('Q'), + Some('R'), + Some('S'), + Some('T'), + Some('U'), + Some('V'), + Some('W'), // 0x50-0x57 + Some('X'), + Some('Y'), + Some('Z'), + Some('['), + Some('\u{005C}'), + Some(']'), + Some('^'), + Some('_'), // 0x58-0x5f + Some('`'), + Some('a'), + Some('b'), + Some('c'), + Some('d'), + Some('e'), + Some('f'), + Some('g'), // 0x60-0x67 + Some('h'), + Some('i'), + Some('j'), + Some('k'), + Some('l'), + Some('m'), + Some('n'), + Some('o'), // 0x68-0x6f + Some('p'), + Some('q'), + Some('r'), + Some('s'), + Some('t'), + Some('u'), + Some('v'), + Some('w'), // 0x70-0x77 + Some('x'), + Some('y'), + Some('z'), + Some('{'), + Some('|'), + Some('}'), + Some('~'), + Some('\u{007F}'), // 0x78-0x7f + Some('€'), + None, + Some('‚'), + Some('ƒ'), + Some('„'), + Some('…'), + Some('†'), + Some('‡'), // 0x80-0x87 + Some('ˆ'), + Some('‰'), + None, + Some('‹'), + Some('Œ'), + None, + None, + None, // 0x88-0x8f + None, + Some('‘'), + Some('’'), + Some('“'), + Some('”'), + Some('•'), + Some('–'), + Some('—'), // 0x90-0x97 + Some('˜'), + Some('™'), + None, + Some('›'), + Some('œ'), + None, + None, + Some('Ÿ'), // 0x98-0x9f + Some('\u{00A0}'), + Some('¡'), + Some('¢'), + Some('£'), + Some('¤'), + Some('¥'), + Some('¦'), + Some('§'), // 0xa0-0xa7 + Some('¨'), + Some('©'), + Some('ª'), + Some('«'), + Some('¬'), + Some('\u{00AD}'), + Some('®'), + Some('¯'), // 0xa8-0xaf + Some('°'), + Some('±'), + Some('²'), + Some('³'), + Some('´'), + Some('µ'), + Some('¶'), + Some('·'), // 0xb0-0xb7 + Some('¸'), + Some('¹'), + Some('º'), + Some('»'), + Some('¼'), + Some('½'), + Some('¾'), + Some('¿'), // 0xb8-0xbf + Some('À'), + Some('Á'), + Some('Â'), + Some('Ă'), + Some('Ä'), + Some('Å'), + Some('Æ'), + Some('Ç'), // 0xc0-0xc7 + Some('È'), + Some('É'), + Some('Ê'), + Some('Ë'), + Some('̀'), + Some('Í'), + Some('Î'), + Some('Ï'), // 0xc8-0xcf + Some('Đ'), + Some('Ñ'), + Some('̉'), + Some('Ó'), + Some('Ô'), + Some('Ơ'), + Some('Ö'), + Some('×'), // 0xd0-0xd7 + Some('Ø'), + Some('Ù'), + Some('Ú'), + Some('Û'), + Some('Ü'), + Some('Ư'), + Some('̃'), + Some('ß'), // 0xd8-0xdf + Some('à'), + Some('á'), + Some('â'), + Some('ă'), + Some('ä'), + Some('å'), + Some('æ'), + Some('ç'), // 0xe0-0xe7 + Some('è'), + Some('é'), + Some('ê'), + Some('ë'), + Some('́'), + Some('í'), + Some('î'), + Some('ï'), // 0xe8-0xef + Some('đ'), + Some('ñ'), + Some('̣'), + Some('ó'), + Some('ô'), + Some('ơ'), + Some('ö'), + Some('÷'), // 0xf0-0xf7 + Some('ø'), + Some('ù'), + Some('ú'), + Some('û'), + Some('ü'), + Some('ư'), + Some('₫'), + Some('ÿ'), // 0xf8-0xff +]; diff --git a/src/tables/single.rs b/src/tables/dos.rs similarity index 100% rename from src/tables/single.rs rename to src/tables/dos.rs diff --git a/src/tables/mod.rs b/src/tables/mod.rs index be3a483..eaf04eb 100644 --- a/src/tables/mod.rs +++ b/src/tables/mod.rs @@ -2,7 +2,8 @@ //! `tools/gen_tables.py` from the vendored Microsoft mapping tables in //! `data/` — regenerate rather than editing by hand. -pub(crate) mod single; +pub(crate) mod ansi; +pub(crate) mod dos; #[cfg(feature = "dbcs")] pub(crate) mod cp932; diff --git a/tools/gen_tables.py b/tools/gen_tables.py index ec91ceb..ae625bf 100644 --- a/tools/gen_tables.py +++ b/tools/gen_tables.py @@ -5,14 +5,15 @@ """Generate src/tables/ from the Microsoft mapping tables in data/. The inputs are the canonical Microsoft code page tables published by the -Unicode Consortium (https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/, -``PC/`` for the single-byte DOS pages and ``WINDOWS/`` for the double-byte -CJK pages). +Unicode Consortium (https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/): +``PC/`` (vendored in ``data/pc/``) for the single-byte DOS pages and +``WINDOWS/`` (vendored in ``data/windows/``) for the Windows ANSI pages and +the double-byte CJK pages. Single-byte pages become full 256-entry ``[Option; 256]`` tables: MS-DOS pages are not uniformly ASCII in the low half (CP864 maps 0x25 to ARABIC PERCENT SIGN) and several pages leave byte values undefined -(CP857/864/869/874). +(CP857/864/869/874, most of the ANSI pages). Double-byte pages become a 256-entry single-byte/lead-byte table plus a pair of sorted ``(code, scalar)`` arrays for binary search. Where several codes @@ -33,13 +34,19 @@ from collections.abc import Sequence from dataclasses import dataclass from pathlib import Path -SINGLE_BYTE_PAGES: Sequence[int] = ( +DOS_PAGES: Sequence[int] = ( 437, 737, 775, 850, 852, 855, 857, 860, 861, 862, 863, 864, 865, 866, 869, 874, ) +ANSI_PAGES: Sequence[int] = ( + 874, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, +) DOUBLE_BYTE_PAGES: Sequence[int] = (932, 936, 949, 950) DATA_DIR = Path(__file__).resolve().parent.parent / "data" +PC_DIR = DATA_DIR / "pc" +WINDOWS_DIR = DATA_DIR / "windows" +BESTFIT_DIR = DATA_DIR / "bestfit" OUTPUT_DIR = Path(__file__).resolve().parent.parent / "src" / "tables" GENERATED_NOTE = """\ @@ -316,27 +323,39 @@ def render_double_byte_page( ) -def main() -> None: - """Regenerate src/tables/ from every configured code page.""" - outputs: list[Path] = [] +def generate_single_byte_module( + output_name: str, source_dir: Path, code_pages: Sequence[int] +) -> Path: + """Render a family of single-byte pages into one tables module. - single_rendered = [GENERATED_NOTE] - for code_page in SINGLE_BYTE_PAGES: - table = parse_table(DATA_DIR / f"CP{code_page}.TXT") + Raises: + TableError: If any page skips a byte value or contains DBCS content. + """ + rendered = [GENERATED_NOTE] + for code_page in code_pages: + table = parse_table(source_dir / f"CP{code_page}.TXT") if table.listed_bytes != set(range(256)): missing = sorted(set(range(256)) - table.listed_bytes) raise TableError(f"CP{code_page}: bytes never listed: {missing}") if table.leads or table.pairs: raise TableError(f"CP{code_page}: unexpected DBCS content") check_bijection(f"CP{code_page}", table) - single_rendered.append(render_single_byte_page(code_page, table)) - single_path = OUTPUT_DIR / "single.rs" - single_path.write_text("\n".join(single_rendered), encoding="utf-8") - outputs.append(single_path) + rendered.append(render_single_byte_page(code_page, table)) + path = OUTPUT_DIR / output_name + path.write_text("\n".join(rendered), encoding="utf-8") + return path + + +def main() -> None: + """Regenerate src/tables/ from every configured code page.""" + outputs = [ + generate_single_byte_module("dos.rs", PC_DIR, DOS_PAGES), + generate_single_byte_module("ansi.rs", WINDOWS_DIR, ANSI_PAGES), + ] for code_page in DOUBLE_BYTE_PAGES: - table = parse_table(DATA_DIR / f"CP{code_page}.TXT") - wctable = parse_wctable(DATA_DIR / f"bestfit{code_page}.txt") + table = parse_table(WINDOWS_DIR / f"CP{code_page}.TXT") + wctable = parse_wctable(BESTFIT_DIR / f"bestfit{code_page}.txt") encode = resolve_encode(f"CP{code_page}", table, wctable) page_path = OUTPUT_DIR / f"cp{code_page}.rs" page_path.write_text(