From: Jarkko Hietaniemi Date: Tue, 23 Sep 2003 09:11:23 +0000 (+0000) Subject: [perl #23979] GSM 03.38 mapping in Encoding::Byte is incorrect X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=e74d743733c842b1419d7531d7585c088b422f2c;p=p5sagit%2Fp5-mst-13.2.git [perl #23979] GSM 03.38 mapping in Encoding::Byte is incorrect Fix as much as possible - the specification is still a bit unclear. p4raw-id: //depot/perl@21331 --- diff --git a/MANIFEST b/MANIFEST index f07a4ee..76a5279 100644 --- a/MANIFEST +++ b/MANIFEST @@ -285,6 +285,7 @@ ext/Encode/t/fallback.t test script ext/Encode/t/gb2312.enc test data ext/Encode/t/gb2312.utf test data ext/Encode/t/grow.t test script +ext/Encode/t/gsm0338.t test script ext/Encode/t/guess.t test script ext/Encode/t/jisx0201.enc test data ext/Encode/t/jisx0201.utf test data diff --git a/ext/Encode/MANIFEST b/ext/Encode/MANIFEST index f219c38..6a6aab8 100644 --- a/ext/Encode/MANIFEST +++ b/ext/Encode/MANIFEST @@ -74,6 +74,7 @@ t/fallback.t test script t/gb2312.enc test data t/gb2312.utf test data t/grow.t test script +t/gsm0338.t test script t/guess.t test script t/jisx0201.enc test data t/jisx0201.utf test data diff --git a/ext/Encode/lib/Encode/Supported.pod b/ext/Encode/lib/Encode/Supported.pod index d09fc0a..9280a97 100644 --- a/ext/Encode/lib/Encode/Supported.pod +++ b/ext/Encode/lib/Encode/Supported.pod @@ -176,9 +176,23 @@ For gory details, see L GSM0338 is for GSM handsets. Though it shares alphanumerals with ASCII, control character ranges and other parts are mapped very -differently, presumably to store Greek and Cyrillic alphabets. -This is also covered in Encode::Byte even though it is not an -"extended ASCII" encoding. +differently, mainly to store Greek characters. There are also escape +sequences (starting with 0x1B) to cover e.g. the Euro sign. Some +special cases like a trailing 0x00 byte or a lone 0x1B byte are not +well-defined and decode() will return an empty string for them. +One possible workaround is + + $gsm =~ s/\x00\z/\x00\x00/; + $uni = decode("gsm0338", $gsm); + $uni .= "\xA0" if $gsm =~ /\x1B\z/; + +Note that the Encode implementation of GSM0338 does not implement the +reuse of Latin capital letters as Greek capital letters (for example, +the 0x5A is U+005A (LATIN CAPITAL LETTER Z), not U+0396 (GREEK CAPITAL +LETTER ZETA). + +The GSM0338 is also covered in Encode::Byte even though it is not +an "extended ASCII" encoding. =back diff --git a/ext/Encode/t/gsm0338.t b/ext/Encode/t/gsm0338.t new file mode 100644 index 0000000..6066d7a --- /dev/null +++ b/ext/Encode/t/gsm0338.t @@ -0,0 +1,62 @@ +BEGIN { + if ($ENV{'PERL_CORE'}){ + chdir 't'; + unshift @INC, '../lib'; + } + require Config; import Config; + if ($Config{'extensions'} !~ /\bEncode\b/) { + print "1..0 # Skip: Encode was not built\n"; + exit 0; + } + $| = 1; +} + +use strict; +use Test::More tests => 21; +use Encode; + +# The specification of GSM 03.38 is not awfully clear. +# (http://www.unicode.org/Public/MAPPINGS/ETSI/GSM0338.TXT) +# The various combinations of 0x00 and 0x1B as leading bytes +# are unclear, as is the semantics of those bytes as standalone +# or as final single bytes. + +sub t { is(decode("gsm0338", my $t = $_[0]), $_[1]) } + +# t("\x00", "\x00"); # ??? + +# "Round-trip". +t("\x41", "\x41"); + +t("\x01", "\xA3"); +t("\x02", "\x24"); +t("\x03", "\xA5"); +t("\x09", "\xE7"); + +t("\x00\x00", "\x00\x00"); # Maybe? +t("\x00\x1B", "\x40\xA0"); # Maybe? +t("\x00\x41", "\x40\x41"); + +# t("\x1B", "\x1B"); # ??? + +# Escape with no special second byte is just a NBSP. +t("\x1B\x41", "\xA0\x41"); + +t("\x1B\x00", "\xA0\x40"); # Maybe? + +# Special escape characters. +t("\x1B\x0A", "\x0C"); +t("\x1B\x14", "\x5E"); +t("\x1B\x28", "\x7B"); +t("\x1B\x29", "\x7D"); +t("\x1B\x2F", "\x5C"); +t("\x1B\x3C", "\x5B"); +t("\x1B\x3D", "\x7E"); +t("\x1B\x3E", "\x5D"); +t("\x1B\x40", "\x7C"); +t("\x1B\x40", "\x7C"); +t("\x1B\x65", "\x{20AC}"); + + + + diff --git a/ext/Encode/ucm/gsm0338.ucm b/ext/Encode/ucm/gsm0338.ucm index f321fb7..11a379a 100644 --- a/ext/Encode/ucm/gsm0338.ucm +++ b/ext/Encode/ucm/gsm0338.ucm @@ -4,47 +4,19 @@ # ./compile -n gsm0338 -o Encode/gsm0338.ucm Encode/gsm0338.enc "gsm0338" 1 - 1 + 2 \x3F # CHARMAP - \x00 |0 # COMMERCIAL AT - \x01 |0 # POUND SIGN - \x02 |0 # DOLLAR SIGN - \x03 |0 # YEN SIGN - \x04 |0 # LATIN SMALL LETTER E WITH GRAVE - \x05 |0 # LATIN SMALL LETTER E WITH ACUTE - \x06 |0 # LATIN SMALL LETTER U WITH GRAVE - \x07 |0 # LATIN SMALL LETTER I WITH GRAVE - \x08 |0 # LATIN SMALL LETTER O WITH GRAVE - \x09 |0 # LATIN SMALL LETTER C WITH CEDILLA + \x00\x00 |0 # NULL + NULL (?) \x0A |0 # LINE FEED - \x0B |0 # LATIN CAPITAL LETTER O WITH STROKE - \x0C |0 # LATIN SMALL LETTER O WITH STROKE + \x1B\x0A |0 # FORM FEED \x0D |0 # CARRIAGE RETURN - \x0E |0 # LATIN CAPITAL LETTER A WITH RING ABOVE - \x0F |0 # LATIN SMALL LETTER A WITH RING ABOVE - \x10 |0 # GREEK CAPITAL LETTER DELTA - \x11 |0 # LOW LINE - \x12 |0 # GREEK CAPITAL LETTER PHI - \x13 |0 # GREEK CAPITAL LETTER GAMMA - \x14 |0 # GREEK CAPITAL LETTER LAMDA - \x15 |0 # GREEK CAPITAL LETTER OMEGA - \x16 |0 # GREEK CAPITAL LETTER PI - \x17 |0 # GREEK CAPITAL LETTER PSI - \x18 |0 # GREEK CAPITAL LETTER SIGMA - \x19 |0 # GREEK CAPITAL LETTER THETA - \x1A |0 # GREEK CAPITAL LETTER XI - \x1B |0 # NO-BREAK SPACE - \x1C |0 # LATIN CAPITAL LETTER AE - \x1D |0 # LATIN SMALL LETTER AE - \x1E |0 # LATIN SMALL LETTER SHARP S - \x1F |0 # LATIN CAPITAL LETTER E WITH ACUTE \x20 |0 # SPACE \x21 |0 # EXCLAMATION MARK \x22 |0 # QUOTATION MARK \x23 |0 # NUMBER SIGN - \x24 |0 # CURRENCY SIGN + \x02 |0 # DOLLAR SIGN \x25 |0 # PERCENT SIGN \x26 |0 # AMPERSAND \x27 |0 # APOSTROPHE @@ -72,7 +44,133 @@ CHARMAP \x3D |0 # EQUALS SIGN \x3E |0 # GREATER-THAN SIGN \x3F |0 # QUESTION MARK - \x40 |0 # INVERTED EXCLAMATION MARK + \x00\x0A |0 # COMMERCIAL AT + LINE FEED + \x00\x0D |0 # COMMERCIAL AT + CARRIAGE RETURN + \x00\x20 |0 # COMMERCIAL AT + SPACE + \x00\x21 |0 # COMMERCIAL AT + EXCLAMATION MARK + \x00\x22 |0 # COMMERCIAL AT + QUOTATION MARK + \x00\x23 |0 # COMMERCIAL AT + NUMBER SIGN + \x00\x02 |0 # COMMERCIAL AT + DOLLAR SIGN + \x00\x25 |0 # COMMERCIAL AT + PERCENT SIGN + \x00\x26 |0 # COMMERCIAL AT + AMPERSAND + \x00\x27 |0 # COMMERCIAL AT + APOSTROPHE + \x00\x28 |0 # COMMERCIAL AT + LEFT PARENTHESIS + \x00\x29 |0 # COMMERCIAL AT + RIGHT PARENTHESIS + \x00\x2A |0 # COMMERCIAL AT + ASTERISK + \x00\x2B |0 # COMMERCIAL AT + PLUS SIGN + \x00\x2C |0 # COMMERCIAL AT + COMMA + \x00\x2D |0 # COMMERCIAL AT + HYPHEN-MINUS + \x00\x2E |0 # COMMERCIAL AT + FULL STOP + \x00\x2F |0 # COMMERCIAL AT + SOLIDUS + \x00\x30 |0 # COMMERCIAL AT + DIGIT ZERO + \x00\x31 |0 # COMMERCIAL AT + DIGIT ONE + \x00\x32 |0 # COMMERCIAL AT + DIGIT TWO + \x00\x33 |0 # COMMERCIAL AT + DIGIT THREE + \x00\x34 |0 # COMMERCIAL AT + DIGIT FOUR + \x00\x35 |0 # COMMERCIAL AT + DIGIT FIVE + \x00\x36 |0 # COMMERCIAL AT + DIGIT SIX + \x00\x37 |0 # COMMERCIAL AT + DIGIT SEVEN + \x00\x38 |0 # COMMERCIAL AT + DIGIT EIGHT + \x00\x39 |0 # COMMERCIAL AT + DIGIT NINE + \x00\x3A |0 # COMMERCIAL AT + COLON + \x00\x3B |0 # COMMERCIAL AT + SEMICOLON + \x00\x3C |0 # COMMERCIAL AT + LESS-THAN SIGN + \x00\x3D |0 # COMMERCIAL AT + EQUALS SIGN + \x00\x3E |0 # COMMERCIAL AT + GREATER-THAN SIGN + \x00\x3F |0 # COMMERCIAL AT + QUESTION MARK + \x00\x41 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER A + \x00\x42 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER B + \x00\x43 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER C + \x00\x44 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER D + \x00\x45 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER E + \x00\x46 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER F + \x00\x47 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER G + \x00\x48 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER H + \x00\x49 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER I + \x00\x4A |0 # COMMERCIAL AT + LATIN CAPITAL LETTER J + \x00\x4B |0 # COMMERCIAL AT + LATIN CAPITAL LETTER K + \x00\x4C |0 # COMMERCIAL AT + LATIN CAPITAL LETTER L + \x00\x4D |0 # COMMERCIAL AT + LATIN CAPITAL LETTER M + \x00\x4E |0 # COMMERCIAL AT + LATIN CAPITAL LETTER N + \x00\x4F |0 # COMMERCIAL AT + LATIN CAPITAL LETTER O + \x00\x50 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER P + \x00\x51 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER Q + \x00\x52 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER R + \x00\x53 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER S + \x00\x54 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER T + \x00\x55 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER U + \x00\x56 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER V + \x00\x57 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER W + \x00\x58 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER X + \x00\x59 |0 # COMMERCIAL AT + LATIN CAPITAL LETTER Y + \x00\x5A |0 # COMMERCIAL AT + LATIN CAPITAL LETTER Z + \x00\x11 |0 # COMMERCIAL AT + LOW LINE + \x00\x61 |0 # COMMERCIAL AT + LATIN SMALL LETTER A + \x00\x62 |0 # COMMERCIAL AT + LATIN SMALL LETTER B + \x00\x63 |0 # COMMERCIAL AT + LATIN SMALL LETTER C + \x00\x64 |0 # COMMERCIAL AT + LATIN SMALL LETTER D + \x00\x65 |0 # COMMERCIAL AT + LATIN SMALL LETTER E + \x00\x66 |0 # COMMERCIAL AT + LATIN SMALL LETTER F + \x00\x67 |0 # COMMERCIAL AT + LATIN SMALL LETTER G + \x00\x68 |0 # COMMERCIAL AT + LATIN SMALL LETTER H + \x00\x69 |0 # COMMERCIAL AT + LATIN SMALL LETTER I + \x00\x6A |0 # COMMERCIAL AT + LATIN SMALL LETTER J + \x00\x6B |0 # COMMERCIAL AT + LATIN SMALL LETTER K + \x00\x6C |0 # COMMERCIAL AT + LATIN SMALL LETTER L + \x00\x6D |0 # COMMERCIAL AT + LATIN SMALL LETTER M + \x00\x6E |0 # COMMERCIAL AT + LATIN SMALL LETTER N + \x00\x6F |0 # COMMERCIAL AT + LATIN SMALL LETTER O + \x00\x70 |0 # COMMERCIAL AT + LATIN SMALL LETTER P + \x00\x71 |0 # COMMERCIAL AT + LATIN SMALL LETTER Q + \x00\x72 |0 # COMMERCIAL AT + LATIN SMALL LETTER R + \x00\x73 |0 # COMMERCIAL AT + LATIN SMALL LETTER S + \x00\x74 |0 # COMMERCIAL AT + LATIN SMALL LETTER T + \x00\x75 |0 # COMMERCIAL AT + LATIN SMALL LETTER U + \x00\x76 |0 # COMMERCIAL AT + LATIN SMALL LETTER V + \x00\x77 |0 # COMMERCIAL AT + LATIN SMALL LETTER W + \x00\x78 |0 # COMMERCIAL AT + LATIN SMALL LETTER X + \x00\x79 |0 # COMMERCIAL AT + LATIN SMALL LETTER Y + \x00\x7A |0 # COMMERCIAL AT + LATIN SMALL LETTER Z + \x00\x1B |0 # COMMERCIAL AT + NO-BREAK SPACE (?) + \x00\x40 |0 # COMMERCIAL AT + INVERTED EXCLAMATION MARK + \x00\x01 |0 # COMMERCIAL AT + POUND SIGN + \x00\x24 |0 # COMMERCIAL AT + CURRENCY SIGN + \x00\x03 |0 # COMMERCIAL AT + YEN SIGN + \x00\x5F |0 # COMMERCIAL AT + SECTION SIGN + \x00\x60 |0 # COMMERCIAL AT + INVERTED QUESTION MARK + \x00\x5B |0 # COMMERCIAL AT + LATIN CAPITAL LETTER A WITH DIAERESIS + \x00\x0E |0 # COMMERCIAL AT + LATIN CAPITAL LETTER A WITH RING ABOVE + \x00\x1C |0 # COMMERCIAL AT + LATIN CAPITAL LETTER AE + \x00\x1F |0 # COMMERCIAL AT + LATIN CAPITAL LETTER E WITH ACUTE + \x00\x5D |0 # COMMERCIAL AT + LATIN CAPITAL LETTER N WITH TILDE + \x00\x5C |0 # COMMERCIAL AT + LATIN CAPITAL LETTER O WITH DIAERESIS + \x00\x0B |0 # COMMERCIAL AT + LATIN CAPITAL LETTER O WITH STROKE + \x00\x5E |0 # COMMERCIAL AT + LATIN CAPITAL LETTER U WITH DIAERESIS + \x00\x1E |0 # COMMERCIAL AT + LATIN SMALL LETTER SHARP S + \x00\x7F |0 # COMMERCIAL AT + LATIN SMALL LETTER A WITH GRAVE + \x00\x7B |0 # COMMERCIAL AT + LATIN SMALL LETTER A WITH DIAERESIS + \x00\x0F |0 # COMMERCIAL AT + LATIN SMALL LETTER A WITH RING ABOVE + \x00\x1D |0 # COMMERCIAL AT + LATIN SMALL LETTER AE + \x00\x09 |0 # COMMERCIAL AT + LATIN SMALL LETTER C WITH CEDILLA + \x00\x04 |0 # COMMERCIAL AT + LATIN SMALL LETTER E WITH GRAVE + \x00\x05 |0 # COMMERCIAL AT + LATIN SMALL LETTER E WITH ACUTE + \x00\x07 |0 # COMMERCIAL AT + LATIN SMALL LETTER I WITH GRAVE + \x00\x7D |0 # COMMERCIAL AT + LATIN SMALL LETTER N WITH TILDE + \x00\x08 |0 # COMMERCIAL AT + LATIN SMALL LETTER O WITH GRAVE + \x00\x7C |0 # COMMERCIAL AT + LATIN SMALL LETTER O WITH DIAERESIS + \x00\x0C |0 # COMMERCIAL AT + LATIN SMALL LETTER O WITH STROKE + \x00\x06 |0 # COMMERCIAL AT + LATIN SMALL LETTER U WITH GRAVE + \x00\x7E |0 # COMMERCIAL AT + LATIN SMALL LETTER U WITH DIAERESIS + \x00\x13 |0 # COMMERCIAL AT + GREEK CAPITAL LETTER GAMMA + \x00\x10 |0 # COMMERCIAL AT + GREEK CAPITAL LETTER DELTA + \x00\x19 |0 # COMMERCIAL AT + GREEK CAPITAL LETTER THETA + \x00\x14 |0 # COMMERCIAL AT + GREEK CAPITAL LETTER LAMDA + \x00\x1A |0 # COMMERCIAL AT + GREEK CAPITAL LETTER XI + \x00\x16 |0 # COMMERCIAL AT + GREEK CAPITAL LETTER PI + \x00\x18 |0 # COMMERCIAL AT + GREEK CAPITAL LETTER SIGMA + \x00\x12 |0 # COMMERCIAL AT + GREEK CAPITAL LETTER PHI + \x00\x17 |0 # COMMERCIAL AT + GREEK CAPITAL LETTER PSI + \x00\x15 |0 # COMMERCIAL AT + GREEK CAPITAL LETTER OMEGA \x41 |0 # LATIN CAPITAL LETTER A \x42 |0 # LATIN CAPITAL LETTER B \x43 |0 # LATIN CAPITAL LETTER C @@ -99,12 +197,11 @@ CHARMAP \x58 |0 # LATIN CAPITAL LETTER X \x59 |0 # LATIN CAPITAL LETTER Y \x5A |0 # LATIN CAPITAL LETTER Z - \x5B |0 # LATIN CAPITAL LETTER A WITH DIAERESIS - \x5C |0 # LATIN CAPITAL LETTER O WITH DIAERESIS - \x5D |0 # LATIN CAPITAL LETTER N WITH TILDE - \x5E |0 # LATIN CAPITAL LETTER U WITH DIAERESIS - \x5F |0 # SECTION SIGN - \x60 |0 # INVERTED QUESTION MARK + \x1B\x3C |0 # LEFT SQUARE BRACKET + \x1B\x2F |0 # REVERSE SOLIDUS + \x1B\x3E |0 # RIGHT SQUARE BRACKET + \x1B\x14 |0 # CIRCUMFLEX ACCENT + \x11 |0 # LOW LINE \x61 |0 # LATIN SMALL LETTER A \x62 |0 # LATIN SMALL LETTER B \x63 |0 # LATIN SMALL LETTER C @@ -131,9 +228,166 @@ CHARMAP \x78 |0 # LATIN SMALL LETTER X \x79 |0 # LATIN SMALL LETTER Y \x7A |0 # LATIN SMALL LETTER Z + \x1B\x28 |0 # LEFT CURLY BRACKET + \x1B\x40 |0 # VERTICAL LINE + \x1B\x29 |0 # RIGHT CURLY BRACKET + \x1B\x3D |0 # TILDE + \x1B\x0D |0 # NO-BREAK SPACE + CARRIAGE RETURN + \x1B\x20 |0 # NO-BREAK SPACE + SPACE + \x1B\x21 |0 # NO-BREAK SPACE + EXCLAMATION MARK + \x1B\x22 |0 # NO-BREAK SPACE + QUOTATION MARK + \x1B\x23 |0 # NO-BREAK SPACE + NUMBER SIGN + \x1B\x02 |0 # NO-BREAK SPACE + DOLLAR SIGN + \x1B\x25 |0 # NO-BREAK SPACE + PERCENT SIGN + \x1B\x26 |0 # NO-BREAK SPACE + AMPERSAND + \x1B\x27 |0 # NO-BREAK SPACE + APOSTROPHE + \x1B\x2A |0 # NO-BREAK SPACE + ASTERISK + \x1B\x2B |0 # NO-BREAK SPACE + PLUS SIGN + \x1B\x2C |0 # NO-BREAK SPACE + COMMA + \x1B\x2D |0 # NO-BREAK SPACE + HYPHEN-MINUS + \x1B\x2E |0 # NO-BREAK SPACE + FULL STOP + \x1B\x30 |0 # NO-BREAK SPACE + DIGIT ZERO + \x1B\x31 |0 # NO-BREAK SPACE + DIGIT ONE + \x1B\x32 |0 # NO-BREAK SPACE + DIGIT TWO + \x1B\x33 |0 # NO-BREAK SPACE + DIGIT THREE + \x1B\x34 |0 # NO-BREAK SPACE + DIGIT FOUR + \x1B\x35 |0 # NO-BREAK SPACE + DIGIT FIVE + \x1B\x36 |0 # NO-BREAK SPACE + DIGIT SIX + \x1B\x37 |0 # NO-BREAK SPACE + DIGIT SEVEN + \x1B\x38 |0 # NO-BREAK SPACE + DIGIT EIGHT + \x1B\x39 |0 # NO-BREAK SPACE + DIGIT NINE + \x1B\x3A |0 # NO-BREAK SPACE + COLON + \x1B\x3B |0 # NO-BREAK SPACE + SEMICOLON + \x1B\x3F |0 # NO-BREAK SPACE + QUESTION MARK + \x1B\x00 |0 # NO-BREAK SPACE + COMMERCIAL AT + \x1B\x41 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER A + \x1B\x42 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER B + \x1B\x43 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER C + \x1B\x44 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER D + \x1B\x45 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER E + \x1B\x46 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER F + \x1B\x47 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER G + \x1B\x48 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER H + \x1B\x49 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER I + \x1B\x4A |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER J + \x1B\x4B |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER K + \x1B\x4C |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER L + \x1B\x4D |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER M + \x1B\x4E |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER N + \x1B\x4F |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER O + \x1B\x50 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER P + \x1B\x51 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER Q + \x1B\x52 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER R + \x1B\x53 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER S + \x1B\x54 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER T + \x1B\x55 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER U + \x1B\x56 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER V + \x1B\x57 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER W + \x1B\x58 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER X + \x1B\x59 |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER Y + \x1B\x5A |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER Z + \x1B\x11 |0 # NO-BREAK SPACE + LOW LINE + \x1B\x61 |0 # NO-BREAK SPACE + LATIN SMALL LETTER A + \x1B\x62 |0 # NO-BREAK SPACE + LATIN SMALL LETTER B + \x1B\x63 |0 # NO-BREAK SPACE + LATIN SMALL LETTER C + \x1B\x64 |0 # NO-BREAK SPACE + LATIN SMALL LETTER D + \x1B\x66 |0 # NO-BREAK SPACE + LATIN SMALL LETTER F + \x1B\x67 |0 # NO-BREAK SPACE + LATIN SMALL LETTER G + \x1B\x68 |0 # NO-BREAK SPACE + LATIN SMALL LETTER H + \x1B\x69 |0 # NO-BREAK SPACE + LATIN SMALL LETTER I + \x1B\x6A |0 # NO-BREAK SPACE + LATIN SMALL LETTER J + \x1B\x6B |0 # NO-BREAK SPACE + LATIN SMALL LETTER K + \x1B\x6C |0 # NO-BREAK SPACE + LATIN SMALL LETTER L + \x1B\x6D |0 # NO-BREAK SPACE + LATIN SMALL LETTER M + \x1B\x6E |0 # NO-BREAK SPACE + LATIN SMALL LETTER N + \x1B\x6F |0 # NO-BREAK SPACE + LATIN SMALL LETTER O + \x1B\x70 |0 # NO-BREAK SPACE + LATIN SMALL LETTER P + \x1B\x71 |0 # NO-BREAK SPACE + LATIN SMALL LETTER Q + \x1B\x72 |0 # NO-BREAK SPACE + LATIN SMALL LETTER R + \x1B\x73 |0 # NO-BREAK SPACE + LATIN SMALL LETTER S + \x1B\x74 |0 # NO-BREAK SPACE + LATIN SMALL LETTER T + \x1B\x75 |0 # NO-BREAK SPACE + LATIN SMALL LETTER U + \x1B\x76 |0 # NO-BREAK SPACE + LATIN SMALL LETTER V + \x1B\x77 |0 # NO-BREAK SPACE + LATIN SMALL LETTER W + \x1B\x78 |0 # NO-BREAK SPACE + LATIN SMALL LETTER X + \x1B\x79 |0 # NO-BREAK SPACE + LATIN SMALL LETTER Y + \x1B\x7A |0 # NO-BREAK SPACE + LATIN SMALL LETTER Z + \x1B\x01 |0 # NO-BREAK SPACE + POUND SIGN + \x1B\x24 |0 # NO-BREAK SPACE + CURRENCY SIGN + \x1B\x03 |0 # NO-BREAK SPACE + YEN SIGN + \x1B\x5F |0 # NO-BREAK SPACE + SECTION SIGN + \x1B\x60 |0 # NO-BREAK SPACE + INVERTED QUESTION MARK + \x1B\x5B |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER A WITH DIAERESIS + \x1B\x0E |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER A WITH RING ABOVE + \x1B\x1C |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER AE + \x1B\x1F |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER E WITH ACUTE + \x1B\x5D |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER N WITH TILDE + \x1B\x5C |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER O WITH DIAERESIS + \x1B\x0B |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER O WITH STROKE + \x1B\x5E |0 # NO-BREAK SPACE + LATIN CAPITAL LETTER U WITH DIAERESIS + \x1B\x1E |0 # NO-BREAK SPACE + LATIN SMALL LETTER SHARP S + \x1B\x7F |0 # NO-BREAK SPACE + LATIN SMALL LETTER A WITH GRAVE + \x1B\x7B |0 # NO-BREAK SPACE + LATIN SMALL LETTER A WITH DIAERESIS + \x1B\x0F |0 # NO-BREAK SPACE + LATIN SMALL LETTER A WITH RING ABOVE + \x1B\x1D |0 # NO-BREAK SPACE + LATIN SMALL LETTER AE + \x1B\x09 |0 # NO-BREAK SPACE + LATIN SMALL LETTER C WITH CEDILLA + \x1B\x04 |0 # NO-BREAK SPACE + LATIN SMALL LETTER E WITH GRAVE + \x1B\x05 |0 # NO-BREAK SPACE + LATIN SMALL LETTER E WITH ACUTE + \x1B\x07 |0 # NO-BREAK SPACE + LATIN SMALL LETTER I WITH GRAVE + \x1B\x7D |0 # NO-BREAK SPACE + LATIN SMALL LETTER N WITH TILDE + \x1B\x08 |0 # NO-BREAK SPACE + LATIN SMALL LETTER O WITH GRAVE + \x1B\x7C |0 # NO-BREAK SPACE + LATIN SMALL LETTER O WITH DIAERESIS + \x1B\x0C |0 # NO-BREAK SPACE + LATIN SMALL LETTER O WITH STROKE + \x1B\x06 |0 # NO-BREAK SPACE + LATIN SMALL LETTER U WITH GRAVE + \x1B\x7E |0 # NO-BREAK SPACE + LATIN SMALL LETTER U WITH DIAERESIS + \x1B\x13 |0 # NO-BREAK SPACE + GREEK CAPITAL LETTER GAMMA + \x1B\x10 |0 # NO-BREAK SPACE + GREEK CAPITAL LETTER DELTA + \x1B\x19 |0 # NO-BREAK SPACE + GREEK CAPITAL LETTER THETA + \x1B\x1A |0 # NO-BREAK SPACE + GREEK CAPITAL LETTER XI + \x1B\x16 |0 # NO-BREAK SPACE + GREEK CAPITAL LETTER PI + \x1B\x1B |0 # NO-BREAK SPACE + NO-BREAK SPACE (?) + \x1B\x18 |0 # NO-BREAK SPACE + GREEK CAPITAL LETTER SIGMA + \x1B\x12 |0 # NO-BREAK SPACE + GREEK CAPITAL LETTER PHI + \x1B\x17 |0 # NO-BREAK SPACE + GREEK CAPITAL LETTER PSI + \x1B\x15 |0 # NO-BREAK SPACE + GREEK CAPITAL LETTER OMEGA + \x40 |0 # INVERTED EXCLAMATION MARK + \x01 |0 # POUND SIGN + \x24 |0 # CURRENCY SIGN + \x03 |0 # YEN SIGN + \x5F |0 # SECTION SIGN + \x60 |0 # INVERTED QUESTION MARK + \x5B |0 # LATIN CAPITAL LETTER A WITH DIAERESIS + \x0E |0 # LATIN CAPITAL LETTER A WITH RING ABOVE + \x1C |0 # LATIN CAPITAL LETTER AE + \x1F |0 # LATIN CAPITAL LETTER E WITH ACUTE + \x5D |0 # LATIN CAPITAL LETTER N WITH TILDE + \x5C |0 # LATIN CAPITAL LETTER O WITH DIAERESIS + \x0B |0 # LATIN CAPITAL LETTER O WITH STROKE + \x5E |0 # LATIN CAPITAL LETTER U WITH DIAERESIS + \x1E |0 # LATIN SMALL LETTER SHARP S + \x7F |0 # LATIN SMALL LETTER A WITH GRAVE \x7B |0 # LATIN SMALL LETTER A WITH DIAERESIS - \x7C |0 # LATIN SMALL LETTER O WITH DIAERESIS + \x0F |0 # LATIN SMALL LETTER A WITH RING ABOVE + \x1D |0 # LATIN SMALL LETTER AE + \x09 |0 # LATIN SMALL LETTER C WITH CEDILLA + \x04 |0 # LATIN SMALL LETTER E WITH GRAVE + \x05 |0 # LATIN SMALL LETTER E WITH ACUTE + \x07 |0 # LATIN SMALL LETTER I WITH GRAVE \x7D |0 # LATIN SMALL LETTER N WITH TILDE + \x08 |0 # LATIN SMALL LETTER O WITH GRAVE + \x7C |0 # LATIN SMALL LETTER O WITH DIAERESIS + \x0C |0 # LATIN SMALL LETTER O WITH STROKE + \x06 |0 # LATIN SMALL LETTER U WITH GRAVE \x7E |0 # LATIN SMALL LETTER U WITH DIAERESIS - \x7F |0 # LATIN SMALL LETTER A WITH GRAVE + \x13 |0 # GREEK CAPITAL LETTER GAMMA + \x10 |0 # GREEK CAPITAL LETTER DELTA + \x19 |0 # GREEK CAPITAL LETTER THETA + \x14 |0 # GREEK CAPITAL LETTER LAMDA + \x1A |0 # GREEK CAPITAL LETTER XI + \x16 |0 # GREEK CAPITAL LETTER PI + \x18 |0 # GREEK CAPITAL LETTER SIGMA + \x12 |0 # GREEK CAPITAL LETTER PHI + \x17 |0 # GREEK CAPITAL LETTER PSI + \x15 |0 # GREEK CAPITAL LETTER OMEGA + \x1B\x65 |0 # EURO SIGN END CHARMAP