Index: Tools/unicode/gencjkextcodecs.py =================================================================== --- Tools/unicode/gencjkextcodecs.py (revision 0) +++ Tools/unicode/gencjkextcodecs.py (revision 0) @@ -0,0 +1,260 @@ +import os +import re +import string + +EUC_KR_NO_MAKE_UP = 1 + +codecs = [ + # (extcodec, encode buffer size, decode buffer size, flags, + # base codec module, base codec, ext mapping, base mapping) + ('mac_korean', 5, 2, EUC_KR_NO_MAKE_UP, 'kr', 'euc_kr', + 'http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/KOREAN.TXT', + 'http://people.freebsd.org/~perky/i18n/EUC-KR.TXT'), + ('mac_japanese', 5, 2, 0, 'jp', 'shift_jis', + 'http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/JAPANESE.TXT', + ('http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/' + 'SHIFTJIS.TXT')), + ('mac_chinsimp', 2, 2, 0, 'cn', 'gb2312', + 'http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/CHINSIMP.TXT', + 'http://people.freebsd.org/~perky/i18n/EUC-CN.TXT'), + ('mac_chintrad', 2, 2, 0, 'tw', 'big5', + 'http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/CHINTRAD.TXT', + 'http://people.freebsd.org/~perky/i18n/BIG5.TXT'), +] + +basemapfix = { # apply our real mapping + 'mac_japanese': ( + {u'\x5c': '\x5c', u'\x7e': '\x7e'}, + {'\x5c': u'\x5c', '\x7e': u'\x7e'}, + ), +} + +additionaltune = { + 'mac_japanese': """\ + # User-defined range + lowset = map(chr, range(0x40, 0x7f) + range(0x80, 0xfd)) + for high in range(0xf0, 0xfd): + decode_map[chr(high)] = 2 + for j, low in enumerate(lowset): + u = unichr(high * 188 + j + 12224) + c = chr(high) + low + encode_map[u] = c + decode_map[c] = u + del high, j, low, lowset, u, c + """ +} + +TEMPLATE = string.Template("""\ +# +# $encoding.py: Python Unicode Codec for $ENCODING +# +# Written by Hye-Shik Chang +# + +import _codecs_$basemodule, codecs +import _multibytecodec as mbc + +encode_map = { +$encodemap +} + +decode_map = { +$decodemap +} +$additionaltune +basecodec = _codecs_$basemodule.getcodec('$baseencoding') +codec = mbc.create_extcodec('$encoding', basecodec, encode_map, decode_map, + $encbuf, $decbuf, $flags) + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='$encoding', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) +""") + +def multichr(codepoint): + codepoint = int(codepoint[2:], 16) + if codepoint >= 0x100: + return chr(codepoint // 256) + chr(codepoint % 256) + else: + return chr(codepoint) + +def multiunichr(codepoint): + return u''.join( + unichr(int(point[2:], 16)) for point in codepoint.split('+')) + +def readmap(f): + emap, dmap = {}, {} + comments = {} + for l in f: + if '#' in l: + content, comment = map(str.strip, l.split('#', 1)) + else: + content, comment = l.strip(), '' + + if not content: + continue + legacy, uni = content.split() + lch, uch = multichr(legacy), multiunichr(uni) + emap[uch] = lch + dmap[lch] = uch + comments[uch] = comment + + return emap, dmap, comments + +def openurl(url): + import urllib + basepart = os.path.basename(url) + if not os.path.exists(basepart): + urllib.urlretrieve(url, filename=basepart) + return open(basepart) + +def removeduplicates(extmap, basemap): + extmap, basemap = extmap.copy(), basemap.copy() + commonkeys = set(extmap) & set(basemap) + + for key in commonkeys: + if extmap[key] == basemap[key]: + del extmap[key] + del basemap[key] + + for dkey in basemap: # place blockers for deleted codes in extension + extmap.setdefault(dkey, None) + + return extmap + +def codecdifference(encoding, extmapurl, basemapurl): + extemap, extdmap, extcomments = readmap(openurl(extmapurl)) + baseemap, basedmap, basecomments = readmap(openurl(basemapurl)) + if encoding in basemapfix: + baseemap.update(basemapfix[encoding][0]) + basedmap.update(basemapfix[encoding][1]) + + emappatch = removeduplicates(extemap, baseemap) + dmappatch = removeduplicates(extdmap, basedmap) + + # remove control characters from the comparison (character maps miss them) + for i in range(0x20) + [0x7f]: + if unichr(i) in emappatch: + del emappatch[unichr(i)] + if chr(i) in dmappatch: + del dmappatch[chr(i)] + + # place window size hints for multiple-byte codes + for dkey in dmappatch.keys(): + if len(dkey) > 2: + raise NotImplementedError + elif len(dkey) > 1: + if dmappatch.get(dkey[0], 2) != 2: + raise ValueError, "multiple candidates come for 0x%x" % ord( + dkey[0]) + if dkey[0] in extdmap or dkey[0] in basedmap: + raise ValueError, "collision of the first char in decoding map" + dmappatch[dkey[0]] = 2 + + # place window size hints for encode maps. These are bit trickier + # because some unicode points have corresponding legacy codepoints for both + # unmodified and modified by following characters. + for ekey in emappatch.keys(): + if len(ekey) <= 1: + continue + + for st in range(1, len(ekey)): + prefix = ekey[:st] + if prefix in emappatch: + if isinstance(emappatch[prefix], str): + emappatch[prefix] = (st + 1, emappatch[prefix]) + elif emappatch[prefix] is None: + raise NotImplementedError + elif prefix in baseemap: + emappatch[prefix] = (st + 1, baseemap[prefix]) + else: + emappatch[prefix] = st + 1 + + basecomments.update(extcomments) + return emappatch, dmappatch, basecomments + +def getadditionaltune(enc): + if enc not in additionaltune: + return '' + + code = additionaltune[enc].splitlines() + # reindent to top-level + indent = re.compile('^' + re.match('^ *', code[0]).group()) + return '\n' + '\n'.join(indent.sub('', line) for line in code) + +def reprmap(m, comments, commentfield=0): + r = [] + for k, v in sorted(m.items()): + comment = comments.get((k, v)[commentfield], '') + s = ' %s: %s,' % (repr(k), repr(v)) + r.append(('%-35s # %s' % (s, comment)).rstrip('# \t')) + + return '\n'.join(r) + +def reprmap_condensed(m, comments, commentfield=0): + linewidth = 79 + r = [''] + def write(s): + if len(r[-1]) + len(s) <= linewidth: + r[-1] += s + else: + r.append(s) + + for k, v in sorted(m.items()): + write(repr(k)) + write(':') + write(repr(v) if not isinstance(v, tuple) + else '(%s,%s)' % (repr(v[0]), repr(v[1]))) + write(',') + + return '\n'.join(r).rstrip(',\n') + +if __name__ == '__main__': + import sys + + prefix = sys.argv[1] if len(sys.argv) >= 2 else '.' + condensed = (len(sys.argv) >= 3 and sys.argv[2] == '-c') + if condensed: + reprmap = reprmap_condensed + + for enc, encbuf, decbuf, flags, basemod, baseenc, \ + extmapurl, basemapurl in codecs: + emap, dmap, comments = codecdifference(enc, extmapurl, basemapurl) + + encodemap = reprmap(emap, comments, 0) + decodemap = reprmap(dmap, comments, 1) + + tune = getadditionaltune(enc) + + code = TEMPLATE.substitute(ENCODING=enc.upper(), encoding=enc.lower(), + baseencoding=baseenc, basemodule=basemod, + encodemap=encodemap, decodemap=decodemap, + encbuf=str(encbuf), decbuf=str(decbuf), + flags=flags, additionaltune=tune) + codecpath = os.path.join(prefix, enc + '.py') + open(codecpath, 'w').write(code) Index: Tools/unicode/Makefile =================================================================== --- Tools/unicode/Makefile (revision 64531) +++ Tools/unicode/Makefile (working copy) @@ -15,7 +15,7 @@ all: distclean mappings codecs -codecs: misc windows iso apple ebcdic custom-mappings cjk +codecs: misc windows iso apple ebcdic custom-mappings cjk cjkext ### Mappings @@ -75,6 +75,9 @@ cjk: build/ $(PYTHON) gencjkcodecs.py build/ +cjkext: build/ + $(PYTHON) gencjkextcodecs.py build/ -c + ### Cleanup clean: Index: Doc/library/codecs.rst =================================================================== --- Doc/library/codecs.rst (revision 64531) +++ Doc/library/codecs.rst (working copy) @@ -1036,6 +1036,14 @@ +-----------------+--------------------------------+--------------------------------+ | koi8_u | | Ukrainian | +-----------------+--------------------------------+--------------------------------+ +| mac_chinsimp | cp10008, macchinsimp, | Simplified Chinese | +| | macchinesesimplified, | | +| | x-mac-chinesesimp | | ++-----------------+--------------------------------+--------------------------------+ +| mac_chintrad | cp10002, macchintrad, | Traditional Chinese | +| | macchinesetraditional, | | +| | x-mac-chinesetrad | | ++-----------------+--------------------------------+--------------------------------+ | mac_cyrillic | maccyrillic | Bulgarian, Byelorussian, | | | | Macedonian, Russian, Serbian | +-----------------+--------------------------------+--------------------------------+ @@ -1045,6 +1053,12 @@ +-----------------+--------------------------------+--------------------------------+ | mac_latin2 | maclatin2, maccentraleurope | Central and Eastern Europe | +-----------------+--------------------------------+--------------------------------+ +| mac_japanese | cp10001, macjapanese, | Japanese | +| | x-mac-japanese | | ++-----------------+--------------------------------+--------------------------------+ +| mac_korean | cp10003, mackorean, | Korean | +| | x-mac-korean | | ++-----------------+--------------------------------+--------------------------------+ | mac_roman | macroman | Western Europe | +-----------------+--------------------------------+--------------------------------+ | mac_turkish | macturkish | Turkish | Index: Lib/encodings/mac_korean.py =================================================================== --- Lib/encodings/mac_korean.py (revision 0) +++ Lib/encodings/mac_korean.py (revision 0) @@ -0,0 +1,930 @@ +# +# mac_korean.py: Python Unicode Codec for MAC_KOREAN +# +# Written by Hye-Shik Chang +# + +import _codecs_kr, codecs +import _multibytecodec as mbc + +encode_map = { +u'!':(2,'!'),u'!\uf877':'\xa1\x8a',u'!\uf87f':'\xad\xb0',u'(':(2,'('), +u'(\uf87c':'\xa1W',u'(\uf87f':'\xa2K',u')':(2,')'),u')\uf87c':'\xa1X', +u')\uf87f':'\xa2L',u'*':(2,'*'),u'*\uf877':'\xa1l',u'-':(2,'-'),u'-\u0308': +'\xa7g',u'0':(2,'0'),u'0\u20de':'\xa5A',u'1':(2,'1'),u'1\u20de':(3,'\xa5B'), +u'1\u20de\uf875':'\xac\xc2',u'1\u20de\uf87a':'\xa4U',u'1\u20de\uf87b':'\xa3A', +u'1\u20de\uf87c':'\xa2\xe6',u'1\u20de\uf87f':'\xa4A',u'2':(2,'2'),u'2\u20de': +(3,'\xa5C'),u'2\u20de\uf875':'\xac\xc3',u'2\u20de\uf87a':'\xa4V', +u'2\u20de\uf87b':'\xa3B',u'2\u20de\uf87c':'\xa2\xe7',u'2\u20de\uf87f':'\xa4B', +u'3':(2,'3'),u'3\u20de':(3,'\xa5D'),u'3\u20de\uf875':'\xac\xc4', +u'3\u20de\uf87a':'\xa4W',u'3\u20de\uf87b':'\xa3C',u'3\u20de\uf87c':'\xa2\xe8', +u'3\u20de\uf87f':'\xa4C',u'4':(2,'4'),u'4\u20de':(3,'\xa5E'),u'4\u20de\uf875': +'\xac\xc5',u'4\u20de\uf87a':'\xa4X',u'4\u20de\uf87b':'\xa3D',u'4\u20de\uf87c': +'\xa2\xe9',u'4\u20de\uf87f':'\xa4D',u'5':(2,'5'),u'5\u20de':(3,'\xa5F'), +u'5\u20de\uf875':'\xac\xc6',u'5\u20de\uf87a':'\xa4Y',u'5\u20de\uf87b':'\xa3E', +u'5\u20de\uf87c':'\xa2\xea',u'5\u20de\uf87f':'\xa4E',u'6':(2,'6'),u'6\u20de': +(3,'\xa5G'),u'6\u20de\uf875':'\xac\xc7',u'6\u20de\uf87a':'\xa4Z', +u'6\u20de\uf87b':'\xa3F',u'6\u20de\uf87c':'\xa2\xeb',u'6\u20de\uf87f':'\xa4F', +u'7':(2,'7'),u'7\u20de':(3,'\xa5H'),u'7\u20de\uf875':'\xac\xc8', +u'7\u20de\uf87a':'\xa4[',u'7\u20de\uf87b':'\xa3G',u'7\u20de\uf87c':'\xa2\xec', +u'7\u20de\uf87f':'\xa4G',u'8':(2,'8'),u'8\u20de':(3,'\xa5I'),u'8\u20de\uf875': +'\xac\xc9',u'8\u20de\uf87a':'\xa4\\',u'8\u20de\uf87b':'\xa3H',u'8\u20de\uf87c': +'\xa2\xed',u'8\u20de\uf87f':'\xa4H',u'9':(2,'9'),u'9\u20de':(3,'\xa5J'), +u'9\u20de\uf875':'\xac\xca',u'9\u20de\uf87a':'\xa4]',u'9\u20de\uf87b':'\xa3I', +u'9\u20de\uf87c':'\xa2\xee',u'9\u20de\uf87f':'\xa4I',u'<':(2,'<'),u'<\uf877': +'\xa1y',u'=':(2,'='),u'=\u20d2':'\xa7e',u'=\u20e5':'\xa7b',u'>':(2,'>'), +u'>\uf877':'\xa1x',u'[':(2,'['),u'[\uf877':'\xa1\x83',u'[\uf87b':'\xa1a', +u'[\uf87c':'\xa1c',u']':(2,']'),u']\uf877':'\xa1\x84',u']\uf87b':'\xa1b', +u']\uf87c':'\xa1d',u'{':(2,'{'),u'{\uf877':'\xa1\x81',u'}':(2,'}'),u'}\uf877': +'\xa1\x82',u'\x85':'\x85',u'\x86':'\x86',u'\x87':'\x87',u'\x88':'\x88',u'\x89': +'\x89',u'\x8a':'\x8a',u'\x8b':'\x8b',u'\x8c':'\x8c',u'\x8d':'\x8d',u'\x8e': +'\x8e',u'\x8f':'\x8f',u'\x90':'\x90',u'\x91':'\x91',u'\x92':'\x92',u'\x93': +'\x93',u'\x94':'\x94',u'\x95':'\x95',u'\x96':'\x96',u'\x97':'\x97',u'\x98': +'\x98',u'\x99':'\x99',u'\x9a':'\x9a',u'\x9b':'\x9b',u'\x9c':'\x9c',u'\x9d': +'\x9d',u'\x9e':'\x9e',u'\x9f':'\x9f',u'\xa0':'\x80',u'\xa2':'\xa1\xcb',u'\xa3': +'\xa1\xcc',u'\xa5':'\xa1\xcd',u'\xa7':(2,'\xa1\xd7'),u'\xa7\uf87c':'\xa6G', +u'\xa9':'\x83',u'\xab':'\xa6\\',u'\xac':'\xa1\xfe',u'\xad':None,u'\xae':None, +u'\xb1':(2,'\xa1\xbe'),u'\xb1\uf877':'\xa1v',u'\xb6':(2,'\xa2\xd2'), +u'\xb6\uf87f':'\xa2\xfa',u'\xbb':'\xa6]',u'\xd7':(2,'\xa1\xbf'),u'\xd7\uf877': +'\xa1s',u'\u02bc':'\xa1\x98',u'\u02dc':'\xa2\xa6',u'\u03d5':'\xa7j',u'\u2013': +(2,'\xa1\xa9'),u'\u2013\uf87f':'\x82',u'\u2014':'\xa1\xaa',u'\u2015':None, +u'\u2016':(2,'\xa1\xab'),u'\u2016\uf87b':'\xa2\xfb',u'\u2016\uf87c':'\xa2\xfc', +u'\u201b':'\xa1p',u'\u201f':'\xa1o',u'\u2020':(2,'\xa2\xd3'),u'\u2020\uf877': +'\xa1k',u'\u2020\uf87b':'\xa1i',u'\u2020\uf87c':'\xa6C',u'\u2020\uf87f':'\xa1g' +,u'\u2021':(2,'\xa2\xd4'),u'\u2021\uf87c':'\xa1j',u'\u2021\uf87f':'\xa1h', +u'\u2022':'\xa6U',u'\u2026':(2,'\xa1\xa6'),u'\u2026\uf87f':'\xff',u'\u2032': +(2,'\xa1\xc7'),u'\u2032\uf873':'\xad\xae',u'\u2032\uf87f':'\xa5\xdc',u'\u2033': +(2,'\xa1\xc8'),u'\u2033\uf873':'\xad\xac',u'\u2033\uf87f':'\xa5\xdd',u'\u2034': +'\xa5\xde',u'\u2035':'\xad\xad',u'\u2036':'\xad\xab',u'\u2039':'\xa6Z', +u'\u203a':'\xa6[',u'\u203c':(2,'\xa7\x84'),u'\u203c\uf87f':'\xa7\x86',u'\u203e' +:'\xa3\xfe',u'\u2042':(2,'\xa6M'),u'\u2042\uf879':'\xa6Q',u'\u2047':'\xa7\x87', +u'\u2049':'\xa7\x85',u'\u204c':'\xa1\x96',u'\u204d':'\xa1\x97',u'\u204e': +'\xa6N',u'\u2051':(2,'\xa1m'),u'\u2051\uf871':'\xa6O',u'\u2051\uf874':'\xa6K', +u'\u2051\uf879':'\xa1\xa0',u'\u2051\uf87c':'\xa1\x9d',u'\u207a':'\xa1q', +u'\u207b':'\xa1r',u'\u207c':'\xa1z',u'\u207d':'\xa1|',u'\u207e':'\xa1}', +u'\u20a9':(2,'\x81'),u'\u20a9\uf87f':'\xa6\x90',u'\u20ac':None,u'\u2190': +(2,'\xa1\xe7'),u'\u2190\uf870':'\xac\x89',u'\u2190\uf871':'\xa8i', +u'\u2190\uf872':'\xa8k',u'\u2190\uf873':'\xac]',u'\u2190\uf874':'\xacf', +u'\u2190\uf875':'\xa8c',u'\u2190\uf878':'\xacb',u'\u2190\uf879':'\xa8S', +u'\u2190\uf87a':'\xacU',u'\u2190\uf87b':'\xa8B',u'\u2190\uf87c':'\xa8N', +u'\u2190\uf87f':'\xa8_',u'\u2191':(2,'\xa1\xe8'),u'\u2191\uf870':'\xac\x8b', +u'\u2191\uf872':'\xa8m',u'\u2191\uf873':'\xac`',u'\u2191\uf874':'\xach', +u'\u2191\uf875':'\xa8e',u'\u2191\uf878':'\xacd',u'\u2191\uf879':'\xa8U', +u'\u2191\uf87a':'\xacW',u'\u2191\uf87b':'\xa8C',u'\u2191\uf87c':'\xa8O', +u'\u2191\uf87f':'\xa8a',u'\u2192':(2,'\xa1\xe6'),u'\u2192\uf870':'\xac\x8a', +u'\u2192\uf872':'\xa8l',u'\u2192\uf874':'\xacg',u'\u2192\uf875':'\xa8d', +u'\u2192\uf878':'\xacc',u'\u2192\uf879':'\xa8T',u'\u2192\uf87a':'\xacV', +u'\u2192\uf87b':'\xa8A',u'\u2192\uf87c':'\xa8M',u'\u2193':(2,'\xa1\xe9'), +u'\u2193\uf870':'\xac\x8c',u'\u2193\uf872':'\xa8n',u'\u2193\uf873':'\xaca', +u'\u2193\uf874':'\xaci',u'\u2193\uf875':'\xa8f',u'\u2193\uf878':'\xace', +u'\u2193\uf879':'\xa8V',u'\u2193\uf87a':'\xacX',u'\u2193\uf87b':'\xa8D', +u'\u2193\uf87c':'\xa8P',u'\u2193\uf87f':'\xa8b',u'\u2194':(2,'\xa1\xea'), +u'\u2194\uf87c':'\xa8Q',u'\u2195':(2,'\xa2\xd5'),u'\u2195\uf87c':'\xa8R', +u'\u2196':(2,'\xa2\xd8'),u'\u2196\uf87b':'\xa8E',u'\u2197':(2,'\xa2\xd6'), +u'\u2197\uf87b':'\xa8F',u'\u2198':(2,'\xa2\xd9'),u'\u2198\uf87b':'\xa8G', +u'\u2199':(2,'\xa2\xd7'),u'\u2199\uf87b':'\xa8H',u'\u219c':'\xacS',u'\u219d': +'\xacR',u'\u21b0':(2,'\xa8\x82'),u'\u21b0\uf87a':'\xacz',u'\u21b0\uf87c': +'\xac\x85',u'\u21b0\uf87f':'\xa8\x8a',u'\u21b1':(2,'\xa8|'),u'\u21b1\uf87a': +'\xacw',u'\u21b1\uf87c':'\xac\x82',u'\u21b1\uf87f':'\xa8\x87',u'\u21b2':'\xa8{' +,u'\u21b3':'\xa8\x83',u'\u21b4':'\xa8\x81',u'\u21b6':'\xacP',u'\u21b7':'\xacQ', +u'\u21bb':2,u'\u21bb\uf87a':'\xacx',u'\u21bb\uf87b':'\xa8}',u'\u21bb\uf87c': +'\xac\x83',u'\u21bb\uf87f':'\xa8\x88',u'\u21bc':(2,'\xa8\x92'),u'\u21bc\uf879': +'\xa8\x99',u'\u21bc\uf87f':'\xacM',u'\u21c0':(2,'\xa8\x93'),u'\u21c0\uf879': +'\xa8\x98',u'\u21c0\uf87f':'\xacL',u'\u21c4':'\xa8\x9e',u'\u21c5':'\xa8\x9f', +u'\u21cd':'\xa8K',u'\u21cf':'\xa8J',u'\u21d0':(2,'\xa8I'),u'\u21d0\uf87c': +'\xa8\x9b',u'\u21d2':(2,'\xa2\xa1'),u'\u21d2\uf87c':'\xa8\x9a',u'\u21d4': +(2,'\xa2\xa2'),u'\u21d4\uf879':'\xa8\x95',u'\u21d4\uf87f':'\xa8L',u'\u21e0': +'\xacj',u'\u21e1':'\xacl',u'\u21e2':'\xack',u'\u21e3':'\xacm',u'\u21e6': +(2,'\xacr'),u'\u21e6\u20dd':'\xa8[',u'\u21e6\u20de':'\xa8W',u'\u21e6\uf870': +'\xacG',u'\u21e6\uf874':'\xa8\x97',u'\u21e6\uf875':'\xacn',u'\u21e6\uf878': +'\xad\xa6',u'\u21e6\uf879':'\xa8\x8e',u'\u21e6\uf87a':'\xa8s',u'\u21e6\uf87b': +'\xa8w',u'\u21e6\uf87c':'\xacY',u'\u21e6\uf87f':'\xacO',u'\u21e7':(2,'\xact'), +u'\u21e7\u20dd':'\xa8]',u'\u21e7\u20de':'\xa8Y',u'\u21e7\uf875':'\xacp', +u'\u21e7\uf878':'\xad\xa7',u'\u21e7\uf879':'\xa8\x90',u'\u21e7\uf87a':'\xa8u', +u'\u21e7\uf87b':'\xa8y',u'\u21e7\uf87c':'\xac[',u'\u21e7\uf87f':'\xad\xaf', +u'\u21e8':(2,'\xacs'),u'\u21e8\u20de':'\xa8X',u'\u21e8\uf870':'\xacF', +u'\u21e8\uf874':'\xa8\x96',u'\u21e8\uf875':'\xaco',u'\u21e8\uf878':'\xad\xa5', +u'\u21e8\uf879':'\xa8\x8f',u'\u21e8\uf87c':'\xacZ',u'\u21e8\uf87f':'\xacN', +u'\u21e9':(2,'\xacu'),u'\u21e9\u20dd':'\xa8^',u'\u21e9\u20de':'\xa8Z', +u'\u21e9\uf875':'\xacq',u'\u21e9\uf878':'\xad\xa8',u'\u21e9\uf879':'\xa8\x91', +u'\u21e9\uf87a':'\xa8v',u'\u21e9\uf87b':'\xa8z',u'\u21e9\uf87c':'\xac\\', +u'\u21f0':'\xacA',u'\u2206':(2,'\xa7Q'),u'\u2206\uf87f':'\xa7R',u'\u2208': +(2,'\xa1\xf4'),u'\u2208\uf877':'\xa1\x88',u'\u2209':'\xa7s',u'\u220c':'\xa7t', +u'\u2211':(2,'\xa2\xb2'),u'\u2211\uf877':'\xa1\x89',u'\u2213':(2,'\xa7\\'), +u'\u2213\uf877':'\xa1w',u'\u221e':(2,'\xa1\xc4'),u'\u221e\uf877':'\xa1t', +u'\u221f':'\xa7S',u'\u2222':(2,'\xa7h'),u'\u2222\uf87f':'\xa4\x98',u'\u2225': +(2,'\xa7U'),u'\u2225\u0347':'\xa4\x9e',u'\u2226':'\xa7V',u'\u2229': +(2,'\xa1\xfb'),u'\u2229\uf877':'\xa1\x85',u'\u2229\uf87f':'\xa7W',u'\u222a': +(2,'\xa1\xfa'),u'\u222a\uf877':'\xa1\x86',u'\u222a\uf87f':'\xa7T',u'\u2237': +'\xa2\xfe',u'\u223c':None,u'\u223d':(2,'\xa1\xef'),u'\u223d\u0336':'\xa7y', +u'\u223d\uf877':'\xa1u',u'\u2243':'\xa4\x9a',u'\u2245':'\xa4\x99',u'\u2248': +'\xa4\x9b',u'\u2250':'\xa7i',u'\u2251':'\xa7Y',u'\u2253':'\xa7X',u'\u225a': +'\xa7w',u'\u2260':(2,'\xa1\xc1'),u'\u2260\uf877':'\xa1{',u'\u2261': +(2,'\xa1\xd5'),u'\u2261\u20d2':'\xa7n',u'\u2261\u20e5':'\xa7c',u'\u2262': +'\xa7d',u'\u2266':'\xa7Z',u'\u2267':'\xa7[',u'\u226e':'\xa7o',u'\u226f':'\xa7p' +,u'\u2270':'\xa4\x87',u'\u2271':'\xa4\x88',u'\u2272':'\xa4\x89',u'\u2273': +'\xa4\x8a',u'\u2276':'\xa4\x8f',u'\u2277':'\xa4\x90',u'\u2279':'\xa4\x91', +u'\u227a':'\xa4\x81',u'\u227b':'\xa4\x82',u'\u2280':'\xa4\x85',u'\u2281': +'\xa4\x86',u'\u2282':(2,'\xa1\xf8'),u'\u2282\uf877':'\xa1\x87',u'\u2284': +'\xa7r',u'\u2285':'\xa7q',u'\u2295':'\xa7]',u'\u2296':'\xa7^',u'\u2297':'\xa7_' +,u'\u2299':None,u'\u22a3':'\xa7l',u'\u22a4':'\xa4\x9d',u'\u22a5':(2,'\xa1\xd1') +,u'\u22a5\u0338':'\xa7m',u'\u22bb':'\xa7u',u'\u22bc':'\xa7v',u'\u22ce': +'\xa4\x83',u'\u22cf':'\xa4\x84',u'\u22da':'\xa4\x92',u'\u22db':'\xa4\x93', +u'\u22ee':'\xa2\xfd',u'\u2306':'\xa7x',u'\u2314':(2,'\xa7a'),u'\u2314\uf87f': +'\xa7z',u'\u2394':2,u'\u2394\uf876':'\xa7H',u'\u2460':(2,'\xa8\xe7'), +u'\u2460\uf87f':'\xa5L',u'\u2461':(2,'\xa8\xe8'),u'\u2461\uf87f':'\xa5M', +u'\u2462':(2,'\xa8\xe9'),u'\u2462\uf87f':'\xa5N',u'\u2463':(2,'\xa8\xea'), +u'\u2463\uf87f':'\xa5O',u'\u2464':(2,'\xa8\xeb'),u'\u2464\uf87f':'\xa5P', +u'\u2465':(2,'\xa8\xec'),u'\u2465\uf87f':'\xa5Q',u'\u2466':(2,'\xa8\xed'), +u'\u2466\uf87f':'\xa5R',u'\u2467':(2,'\xa8\xee'),u'\u2467\uf87f':'\xa5S', +u'\u2468':(2,'\xa8\xef'),u'\u2468\uf87f':'\xa5T',u'\u246f':'\xa7\xf0',u'\u2470' +:'\xa7\xf1',u'\u2471':'\xa7\xf2',u'\u2472':'\xa7\xf3',u'\u2473':'\xa7\xf4', +u'\u2483':'\xaa\xf4',u'\u2484':'\xaa\xf5',u'\u2485':'\xaa\xf6',u'\u2486': +'\xaa\xf7',u'\u2487':'\xaa\xf8',u'\u24b6':'\xa3\x86',u'\u24b7':'\xa3\x87', +u'\u24b8':'\xa3\x88',u'\u24b9':'\xa3\x89',u'\u24ba':'\xa3\x8a',u'\u24bb': +'\xa3\x8b',u'\u24bc':'\xa3\x8c',u'\u24bd':'\xa3\x8d',u'\u24be':'\xa3\x8e', +u'\u24bf':'\xa3\x8f',u'\u24c0':'\xa3\x90',u'\u24c1':'\xa3\x91',u'\u24c2': +'\xa3\x92',u'\u24c3':'\xa3\x93',u'\u24c4':'\xa3\x94',u'\u24c5':'\xa3\x95', +u'\u24c6':'\xa3\x96',u'\u24c7':'\xa3\x97',u'\u24c8':'\xa3\x98',u'\u24c9': +'\xa3\x99',u'\u24ca':'\xa3\x9a',u'\u24cb':'\xa3\x9b',u'\u24cc':'\xa3\x9c', +u'\u24cd':'\xa3\x9d',u'\u24ce':'\xa3\x9e',u'\u24cf':'\xa3\x9f',u'\u24ea':2, +u'\u24ea\uf87f':'\xa5K',u'\u24eb':(2,'\xa6\xef'),u'\u24eb\uf878':'\xa4s', +u'\u24eb\uf87f':'\xa3_',u'\u24ec':(2,'\xa6\xf0'),u'\u24ec\uf878':'\xa4t', +u'\u24ec\uf87f':'\xa3`',u'\u24ed':(2,'\xa6\xf1'),u'\u24ed\uf878':'\xa4u', +u'\u24ed\uf87f':'\xa3a',u'\u24ee':(2,'\xa6\xf2'),u'\u24ee\uf878':'\xa4v', +u'\u24ee\uf87f':'\xa3b',u'\u24ef':(2,'\xa6\xf3'),u'\u24ef\uf878':'\xa4w', +u'\u24ef\uf87f':'\xa3c',u'\u24f0':(2,'\xa6\xf4'),u'\u24f0\uf878':'\xa4x', +u'\u24f0\uf87f':'\xa3d',u'\u24f1':(2,'\xa6\xf5'),u'\u24f1\uf878':'\xa4y', +u'\u24f1\uf87f':'\xa3e',u'\u24f2':(2,'\xa6\xf6'),u'\u24f2\uf878':'\xa4z', +u'\u24f2\uf87f':'\xa3f',u'\u24f3':(2,'\xa6\xf7'),u'\u24f3\uf878':'\xa4{', +u'\u24f3\uf87f':'\xa3g',u'\u24f4':(2,'\xa6\xf8'),u'\u24f4\uf878':'\xa4|', +u'\u24f4\uf87f':'\xa3h',u'\u2588':'\xa7\x8f',u'\u25a0':(2,'\xa1\xe1'), +u'\u25a0\u20df':'\xa6V',u'\u25a1':(2,'\xa1\xe0'),u'\u25a1\u20df':'\xa6Y', +u'\u25a1\uf879':'\xa7\x8d',u'\u25a1\uf87b':'\xa7\x8e',u'\u25a1\uf87c': +'\xa7\x8c',u'\u25a2':'\xa6x',u'\u25a8':(2,'\xa2\xc9'),u'\u25a8\uf87f': +'\xa6\x8a',u'\u25ad':(2,'\xa7J'),u'\u25ad\uf878':'\xa7I',u'\u25b1':'\xa7f', +u'\u25b2':(2,'\xa1\xe3'),u'\u25b2\u20dd':'\xa6k',u'\u25b3':(2,'\xa1\xe2'), +u'\u25b3\u20dd':'\xa6j',u'\u25b3\uf87f':'\xa7E',u'\u25b4':2,u'\u25b4\u20e4': +'\xa7\x9b',u'\u25b5':'\xa7\x95',u'\u25b9':'\xa7\x96',u'\u25bf':'\xa7\x94', +u'\u25c3':'\xa7\x97',u'\u25c6':(2,'\xa1\xdf'),u'\u25c6\u20de':'\xa6e', +u'\u25c6\uf879':'\xa7\x8b',u'\u25c7':(2,'\xa1\xde'),u'\u25c7\u20de':'\xa6b', +u'\u25c7\u20df':(3,'\xa6W'),u'\u25c7\u20df\u20df':'\xa6a',u'\u25c7\uf879': +'\xa7\x89',u'\u25c7\uf87b':'\xa7\x8a',u'\u25c7\uf87c':'\xa7\x88', +u'\u25c7\uf87f':'\xa7N',u'\u25c8':(2,'\xa2\xc2'),u'\u25c8\uf87f':'\xa6\x89', +u'\u25c9':(2,'\xa2\xc1'),u'\u25c9\u20dd':'\xa6\x82',u'\u25ca':'\xa7\x9c', +u'\u25cb':(2,'\xa1\xdb'),u'\u25cb\uf879':'\xa7\x91',u'\u25cb\uf87b':'\xa7\x92', +u'\u25cb\uf87f':'\xa7D',u'\u25cc':'\xa6u',u'\u25cd':'\xa6\x84',u'\u25ce': +(2,'\xa1\xdd'),u'\u25ce\u20dd':'\xa6i',u'\u25cf':(2,'\xa1\xdc'),u'\u25cf\uf879' +:'\xa7\x93',u'\u25e6':'\xa7\x90',u'\u25ef':(2,'\xa6o'),u'\u25ef\uf87c':'\xa6p', +u'\u25fb':'\xa7F',u'\u25fc':'\xa7\x9a',u'\u2610':(2,'\xa6w'),u'\u2610\uf87c': +'\xa6q',u'\u2610\uf87f':'\xa6v',u'\u261c':(2,'\xa2\xd0'),u'\u261c\uf87f': +'\xa6^',u'\u261d':(2,'\xac\x8d'),u'\u261d\uf87f':'\xac\x8f',u'\u261e': +(2,'\xa2\xd1'),u'\u261e\uf87f':'\xa6_',u'\u261f':(2,'\xac\x8e'),u'\u261f\uf87f' +:'\xac\x90',u'\u262f':(2,'\xa6\x93'),u'\u262f\uf876':'\xa6\x98',u'\u262f\uf87a' +:'\xa6\x97',u'\u2642':(2,'\xa1\xce'),u'\u2642\uf87f':'\xa7A',u'\u2666': +'\xa7\x98',u'\u266f':'\xa6H',u'\u2716':'\xa6m',u'\u271a':'\xa6l',u'\u2720': +(2,'\xa6\x88'),u'\u2720\uf87a':'\xa6\x87',u'\u2723':(2,'\xa6r'),u'\u2723\uf87a' +:'\xa6y',u'\u2731':'\xa6S',u'\u273d':'\xa6R',u'\u273f':(2,'\xa6|'), +u'\u273f\uf87a':'\xa6{',u'\u2740':'\xa6\x99',u'\u2741':'\xa6\x8d',u'\u2747': +'\xa6T',u'\u2748':2,u'\u2748\u20d8':'\xa6\x9b',u'\u274d':'\xa6\x83',u'\u2756': +(2,'\xa6s'),u'\u2756\uf87a':'\xa6z',u'\u2756\uf87f':'\xa6\x8e',u'\u2776': +'\xa6\xe5',u'\u2777':'\xa6\xe6',u'\u2778':'\xa6\xe7',u'\u2779':'\xa6\xe8', +u'\u277a':'\xa6\xe9',u'\u277b':'\xa6\xea',u'\u277c':'\xa6\xeb',u'\u277d': +'\xa6\xec',u'\u277e':'\xa6\xed',u'\u277f':'\xa6\xee',u'\u278a':(2,'\xa3U'), +u'\u278a\uf87f':'\xa4i',u'\u278b':(2,'\xa3V'),u'\u278b\uf87f':'\xa4j',u'\u278c' +:(2,'\xa3W'),u'\u278c\uf87f':'\xa4k',u'\u278d':(2,'\xa3X'),u'\u278d\uf87f': +'\xa4l',u'\u278e':(2,'\xa3Y'),u'\u278e\uf87f':'\xa4m',u'\u278f':(2,'\xa3Z'), +u'\u278f\uf87f':'\xa4n',u'\u2790':(2,'\xa3['),u'\u2790\uf87f':'\xa4o',u'\u2791' +:(2,'\xa3\\'),u'\u2791\uf87f':'\xa4p',u'\u2792':(2,'\xa3]'),u'\u2792\uf87f': +'\xa4q',u'\u2793':(2,'\xa3^'),u'\u2793\uf87f':'\xa4r',u'\u2794':'\xac^', +u'\u279b':'\xa8j',u'\u279c':'\xa8`',u'\u279e':'\xa8x',u'\u27a1':'\xa8t', +u'\u27a4':'\xacH',u'\u27b2':'\xa8\\',u'\u27b5':'\xacC',u'\u27e1':2, +u'\u27e1\u20dd':'\xa6\x85',u'\u2934':(2,'\xa8\x8d'),u'\u2934\uf87a':'\xac}', +u'\u2934\uf87c':'\xac\x88',u'\u2934\uf87f':'\xa8\x85',u'\u2935':(2,'\xa8\x89'), +u'\u2935\uf87a':'\xacy',u'\u2935\uf87c':'\xac\x84',u'\u2936':(2,'\xa8\x86'), +u'\u2936\uf87a':'\xacv',u'\u2936\uf87c':'\xac\x81',u'\u2937':(2,'\xa8\x8b'), +u'\u2937\uf87a':'\xac{',u'\u2937\uf87c':'\xac\x86',u'\u2939':(2,'\xa8\x8c'), +u'\u2939\uf87a':'\xac|',u'\u2939\uf87c':'\xac\x87',u'\u2939\uf87f':'\xa8\x84', +u'\u2962':(2,'\xa8o'),u'\u2962\uf87f':'\xacE',u'\u2963':'\xa8q',u'\u2964': +(2,'\xa8p'),u'\u2964\uf87f':'\xacD',u'\u2965':'\xa8r',u'\u2981':'\xa7\x99', +u'\u2985':(2,'\xa1Y'),u'\u2985\uf873':'\xa2C',u'\u2985\uf878':'\xa2A', +u'\u2985\uf879':'\xa1S',u'\u2985\uf87b':'\xa1e',u'\u2985\uf87c':'\xa1U', +u'\u2985\uf87f':'\xa1Q',u'\u2986':(2,'\xa1Z'),u'\u2986\uf873':'\xa2D', +u'\u2986\uf878':'\xa2B',u'\u2986\uf879':'\xa1T',u'\u2986\uf87b':'\xa1f', +u'\u2986\uf87c':'\xa1V',u'\u2986\uf87f':'\xa1R',u'\u2997':'\xa1\x99',u'\u2998': +'\xa1\x9a',u'\u29a3':'\xa4\x9c',u'\u29be':'\xa6h',u'\u29bf':'\xa6n',u'\u29c8': +(2,'\xa6d'),u'\u29c8\u20de':'\xa6g',u'\u2a26':'\xa4}',u'\u2a38':'\xa7`', +u'\u2a72':'\xa7{',u'\u2a8b':'\xa4\x94',u'\u2a8c':'\xa4\x95',u'\u2a91': +'\xa4\x96',u'\u2a92':'\xa4\x97',u'\u2ac5':'\xa4\x8b',u'\u2ac6':'\xa4\x8d', +u'\u2acb':'\xa4\x8c',u'\u2acc':'\xa4\x8e',u'\u2ae8':'\xa7k',u'\u2afd':2, +u'\u2afd\u0347':'\xa4\x9f',u'\u3002':(2,'\xa1\xa3'),u'\u3002\uf87d':'\xa5\xdb', +u'\u3007':2,u'\u3007\uf876':'\xa1\x8b',u'\u3008':(2,'\xa1\xb4'),u'\u3008\uf878' +:'\xa1K',u'\u3009':(2,'\xa1\xb5'),u'\u3009\uf878':'\xa1L',u'\u300a': +(2,'\xa1\xb6'),u'\u300a\uf878':'\xa1I',u'\u300b':(2,'\xa1\xb7'),u'\u300b\uf878' +:'\xa1J',u'\u300c':(2,'\xa1\xb8'),u'\u300c\uf879':'\xad\xa1',u'\u300c\uf87b': +'\xa1C',u'\u300c\uf87c':'\xa1E',u'\u300c\uf87f':'\xa1A',u'\u300d': +(2,'\xa1\xb9'),u'\u300d\uf879':'\xad\xa2',u'\u300d\uf87b':'\xa1D', +u'\u300d\uf87c':'\xa1F',u'\u300d\uf87f':'\xa1B',u'\u300e':(2,'\xa1\xba'), +u'\u300e\uf879':'\xad\xa3',u'\u300e\uf87c':'\xa1G',u'\u300f':(2,'\xa1\xbb'), +u'\u300f\uf879':'\xad\xa4',u'\u300f\uf87c':'\xa1H',u'\u3010':(2,'\xa1\xbc'), +u'\u3010\uf878':'\xa2I',u'\u3010\uf87f':'\xa1[',u'\u3011':(2,'\xa1\xbd'), +u'\u3011\uf878':'\xa2J',u'\u3011\uf87f':'\xa1\\',u'\u3012':'\xa7B',u'\u3013': +(2,'\xa1\xeb'),u'\u3013\uf87c':'\xa6}',u'\u3016':(2,'\xa1]'),u'\u3016\uf878': +'\xa2G',u'\u3017':(2,'\xa1^'),u'\u3017\uf878':'\xa2H',u'\u3018':'\xa1_', +u'\u3019':'\xa1`',u'\u301c':'\xa1\xad',u'\u301e':'\xad\xa9',u'\u301f': +'\xad\xaa',u'\u3020':'\xa6\x9e',u'\u3036':'\xa7C',u'\u3231':'\xa7\x9d', +u'\u3239':'\xa7\x9e',u'\u3251':(2,'\xa7\xf5'),u'\u3251\uf87a':'\xa6\xf9', +u'\u3252':(2,'\xa7\xf6'),u'\u3252\uf87a':'\xa6\xfa',u'\u3253':(2,'\xa7\xf7'), +u'\u3253\uf87a':'\xa6\xfb',u'\u3254':(2,'\xa7\xf8'),u'\u3254\uf87a':'\xa6\xfc', +u'\u3255':(2,'\xa7\xf9'),u'\u3255\uf87a':'\xa6\xfd',u'\u3256':(2,'\xa7\xfa'), +u'\u3256\uf87a':'\xa6\xfe',u'\u3257':(2,'\xa7\xfb'),u'\u3257\uf87a':'\xa5\xf9', +u'\u3258':(2,'\xa7\xfc'),u'\u3258\uf87a':'\xa5\xfa',u'\u3259':(2,'\xa7\xfd'), +u'\u3259\uf87a':'\xa5\xfb',u'\u325a':(2,'\xa7\xfe'),u'\u325a\uf87a':'\xa5\xfc', +u'\u328a':'\xadq',u'\u328b':'\xadr',u'\u328c':'\xads',u'\u328d':'\xadt', +u'\u328e':'\xadu',u'\u328f':'\xadv',u'\u3290':'\xadp',u'\u3294':'\xab\\', +u'\u329e':(2,'\xa7\x82'),u'\u329e\uf87f':'\xa7\x83',u'\u32a5':'\xabl',u'\u33cb' +:'\xa7\x9f',u'\u4e00':(2,'\xec\xe9'),u'\u4e00\u20de':(3,'\xadU'), +u'\u4e00\u20de\uf87a':'\xadA',u'\u4e00\uf876':'\xa1\x8c',u'\u4e03': +(2,'\xf6\xd2'),u'\u4e03\u20de':(3,'\xad['),u'\u4e03\u20de\uf87a':'\xadG', +u'\u4e03\uf876':'\xa1\x92',u'\u4e09':(2,'\xdf\xb2'),u'\u4e09\u20de':(3,'\xadW') +,u'\u4e09\u20de\uf87a':'\xadC',u'\u4e09\uf876':'\xa1\x8e',u'\u4e5d': +(2,'\xce\xfa'),u'\u4e5d\u20de':(3,'\xad]'),u'\u4e5d\u20de\uf87a':'\xadI', +u'\u4e5d\uf876':'\xa1\x94',u'\u4e8c':(2,'\xec\xa3'),u'\u4e8c\u20de':(3,'\xadV') +,u'\u4e8c\u20de\uf87a':'\xadB',u'\u4e8c\uf876':'\xa1\x8d',u'\u4e94': +(2,'\xe7\xe9'),u'\u4e94\u20de':(3,'\xadY'),u'\u4e94\u20de\uf87a':'\xadE', +u'\u4e94\uf876':'\xa1\x90',u'\u4ed6':(2,'\xf6\xe2'),u'\u4ed6\u20dd':'\xabm', +u'\u4ed6\u20de':'\xaan',u'\u4ee3':(2,'\xd3\xdb'),u'\u4ee3\u20dd':'\xabZ', +u'\u4ee3\u20de':'\xaaZ',u'\u4f8b':(2,'\xd6\xc7'),u'\u4f8b\u20de':'\xaaf', +u'\u516b':(2,'\xf8\xa2'),u'\u516b\u20de':(3,'\xad\\'),u'\u516b\u20de\uf87a': +'\xadH',u'\u516b\uf876':'\xa1\x93',u'\u516d':(2,'\xd7\xbf'),u'\u516d\u20de': +(3,'\xadZ'),u'\u516d\u20de\uf87a':'\xadF',u'\u516d\uf876':'\xa1\x91',u'\u51a0': +(2,'\xce\xae'),u'\u51a0\u20dd':'\xaa\x9f',u'\u51a0\u20de':'\xaaX',u'\u51f8': +(2,'\xf4\xc8'),u'\u51f8\uf87f':'\xa7P',u'\u51f9':(2,'\xe8\xea'),u'\u51f9\uf87f' +:'\xa7O',u'\u524d':(2,'\xee\xf1'),u'\u524d\u20dd':'\xab`',u'\u524d\u20de': +'\xaai',u'\u526f':(2,'\xdc\xf9'),u'\u526f\u20dd':'\xab^',u'\u526f\u20de': +'\xaab',u'\u52a9':(2,'\xf0\xbe'),u'\u52a9\u20dd':'\xabc',u'\u52a9\u20de': +'\xaal',u'\u52d5':(2,'\xd4\xd1'),u'\u52d5\u20dd':'\xab[',u'\u52d5\u20de': +'\xaa\\',u'\u5341':(2,'\xe4\xa8'),u'\u5341\u20de':(3,'\xad^'), +u'\u5341\u20de\uf87a':'\xadJ',u'\u5341\uf876':'\xa1\x95',u'\u534d': +(2,'\xd8\xb3'),u'\u534d\uf87f':'\xa6\x92',u'\u5370':(2,'\xec\xd4'), +u'\u5370\u20dd':'\xabD',u'\u5370\u20de':'\xaaT',u'\u53c3':(2,'\xf3\xd1'), +u'\u53c3\u20dd':'\xabe',u'\u53cd':(2,'\xda\xe3'),u'\u53cd\u20dd':'\xab]', +u'\u53cd\u20de':'\xaa_',u'\u540d':(2,'\xd9\xa3'),u'\u540d\u20de':'\xaa]', +u'\u56db':(2,'\xde\xcc'),u'\u56db\u20de':(3,'\xadX'),u'\u56db\u20de\uf87a': +'\xadD',u'\u56db\uf876':'\xa1\x8f',u'\u570b':(2,'\xcf\xd0'),u'\u570b\u20dd': +'\xabk',u'\u571f':(2,'\xf7\xcf'),u'\u571f\u20de':(3,'\xado'), +u'\u571f\u20de\uf87c':'\xad}',u'\u5b50':(2,'\xed\xad'),u'\u5b50\u20de':'\xaah', +u'\u5e8f':(2,'\xdf\xed'),u'\u5e8f\u20de':'\xaac',u'\u5f62':(2,'\xfb\xa1'), +u'\u5f62\u20dd':'\xabi',u'\u5f62\u20de':'\xaap',u'\u5f71':(2,'\xe7\xaf'), +u'\u5f71\u20de':'\xaae',u'\u611f':(2,'\xca\xef'),u'\u611f\u20dd':'\xabX', +u'\u611f\u20de':'\xaaW',u'\u6163':(2,'\xce\xb1'),u'\u6163\u20dd':'\xabY', +u'\u6307':(2,'\xf2\xa6'),u'\u6307\u20de':'\xaam',u'\u63a5':(2,'\xef\xc8'), +u'\u63a5\u20dd':'\xabb',u'\u63a5\u20de':'\xaak',u'\u65b0':(2,'\xe3\xe6'), +u'\u65b0\u20dd':'\xabg',u'\u65e5':(2,'\xec\xed'),u'\u65e5\u20de':(3,'\xadi'), +u'\u65e5\u20de\uf87c':'\xadw',u'\u6708':(2,'\xea\xc5'),u'\u6708\u20de': +(3,'\xadj'),u'\u6708\u20de\uf87c':'\xadx',u'\u6728':(2,'\xd9\xca'), +u'\u6728\u20de':(3,'\xadm'),u'\u6728\u20de\uf87c':'\xad{',u'\u672b': +(2,'\xd8\xc7'),u'\u672b\u20dd':'\xabF',u'\u672c':(2,'\xdc\xe2'),u'\u672c\u20dd' +:'\xabf',u'\u672c\u20de':'\xaaa',u'\u6c34':(2,'\xe2\xa9'),u'\u6c34\u20de': +(3,'\xadl'),u'\u6c34\u20de\uf87c':'\xadz',u'\u6ce8':(2,'\xf1\xbc'), +u'\u6ce8\u20dd':'\xabd',u'\u6d3e':(2,'\xf7\xef'),u'\u6d3e\u20de':'\xaao', +u'\u6e90':(2,'\xea\xb9'),u'\u6e90\u20de':'\xaag',u'\u706b':(2,'\xfb\xfd'), +u'\u706b\u20de':(3,'\xadk'),u'\u706b\u20de\uf87c':'\xady',u'\u73fe': +(2,'\xfa\xde'),u'\u73fe\u20dd':'\xabh',u'\u76ee':(2,'\xd9\xcd'),u'\u76ee\u20de' +:'\xaa^',u'\u7b54':(2,'\xd3\xcd'),u'\u7b54\u20de':'\xaaY',u'\u7bc0': +(2,'\xef\xbd'),u'\u7bc0\u20de':'\xaaj',u'\u81ea':(2,'\xed\xbb'),u'\u81ea\u20dd' +:'\xab_',u'\u8863':(2,'\xeb\xfd'),u'\u8863\u20dd':'\xabE',u'\u88dc': +(2,'\xdc\xcd'),u'\u88dc\u20de':'\xaa`',u'\u88dc\u20e4':'\xa7|',u'\u8a3b': +(2,'\xf1\xc9'),u'\u8a3b\u20de':(3,'\xaaU'),u'\u8a3b\u20de\uf87a':'\xaav', +u'\u9023':(2,'\xd6\xa7'),u'\u9023\u20de':'\xaad',u'\u91d1':(2,'\xd1\xd1'), +u'\u91d1\u20de':(3,'\xadn'),u'\u91d1\u20de\uf87c':'\xad|',u'\u9593': +(2,'\xca\xe0'),u'\u9593\u20dd':'\xabj',u'\u96fb':(2,'\xef\xb3'),u'\u96fb\u20dd' +:'\xaba',u'\u982d':(2,'\xd4\xe9'),u'\u982d\u20de':'\xaa[',u'\uac00': +(2,'\xb0\xa1'),u'\uac00\u20dd':(3,'\xabu'),u'\uac00\u20dd\uf87a':'\xab\x9b', +u'\uac04':(2,'\xb0\xa3'),u'\uac04\u20dd':'\xabU',u'\uac10':(2,'\xb0\xa8'), +u'\uac10\u20dd':'\xabC',u'\uac10\u20de':'\xaaP',u'\uac19':(2,'\xb0\xb0'), +u'\uac19\u20dd':'\xabV',u'\uac70':(2,'\xb0\xc5'),u'\uac70\u20dd':'\xabG', +u'\uac8c':(2,'\xb0\xd4'),u'\uac8c\u20dd':'\xaa\x96',u'\uad00':(2,'\xb0\xfc'), +u'\uad00\u20dd':'\xaa\x9e',u'\uad50':(2,'\xb1\xb3'),u'\uad50\u20de':3, +u'\uad50\u20de\uf87a':'\xaaw',u'\uad6d':(2,'\xb1\xb9'),u'\uad6d\u20dd':'\xabB', +u'\ub098':(2,'\xb3\xaa'),u'\ub098\u20dd':(3,'\xabv'),u'\ub098\u20dd\uf87a': +'\xab\x9c',u'\ub0ae':(2,'\xb3\xb7'),u'\ub0ae\u20dd':(3,'\xaa\x8c'), +u'\ub0ae\u20dd\uf87a':'\xab\x99',u'\ub192':(2,'\xb3\xf4'),u'\ub192\u20dd': +(3,'\xaa\x8b'),u'\ub192\u20dd\uf87a':'\xab\x98',u'\ub290':(2,'\xb4\xc0'), +u'\ub290\u20dd':3,u'\ub290\u20dd\uf87a':'\xab\x97',u'\ub2e4':(2,'\xb4\xd9'), +u'\ub2e4\u20dd':(3,'\xabw'),u'\ub2e4\u20dd\uf87a':'\xab\x9d',u'\ub2e8': +(2,'\xb4\xdc'),u'\ub2e8\u20dd':(3,'\xac\x91'),u'\ub2e8\u20dd\uf87a':'\xab\x8a', +u'\ub2f5':(2,'\xb4\xe4'),u'\ub2f5\u20dd':(3,'\xabH'),u'\ub2f5\u20dd\uf87a': +'\xab\x87',u'\ub2f5\u20de':(3,'\xaaB'),u'\ub2f5\u20de\uf87a':'\xaas',u'\ub300': +(2,'\xb4\xeb'),u'\ub300\u20dd':'\xaa\x8e',u'\ub300\u20de':'\xaaE',u'\ub3d9': +(2,'\xb5\xbf'),u'\ub3d9\u20dd':'\xaa\x94',u'\ub3d9\u20de':'\xaaK',u'\ub73b': +(2,'\xb6\xe6'),u'\ub73b\u20de':(3,'\xaaS'),u'\ub73b\u20de\uf87a':'\xaau', +u'\ub77c':(2,'\xb6\xf3'),u'\ub77c\u20dd':(3,'\xaa\x81'),u'\ub77c\u20dd\uf87a': +'\xab\x9e',u'\ub9c8':(2,'\xb8\xb6'),u'\ub9c8\u20dd':(3,'\xaa\x82'), +u'\ub9c8\u20dd\uf87a':'\xaby',u'\uba85':(2,'\xb8\xed'),u'\uba85\u20dd': +'\xaa\x8d',u'\uba85\u20de':'\xaaD',u'\ubb38':(2,'\xb9\xae'),u'\ubb38\u20de':3, +u'\ubb38\u20de\uf87a':'\xaar',u'\ubc14':(2,'\xb9\xd9'),u'\ubc14\u20dd': +(3,'\xaa\x83'),u'\ubc14\u20dd\uf87a':'\xabz',u'\ubc18':(2,'\xb9\xdd'), +u'\ubc18\u20dd':(3,'\xaa\x97'),u'\ubc18\u20dd\uf87a':'\xab\x9a',u'\ubc18\u20de' +:'\xaaM',u'\ubcc0':(2,'\xba\xaf'),u'\ubcc0\u20dd':'\xabI',u'\ubcf8': +(2,'\xba\xbb'),u'\ubcf8\u20dd':(3,'\xaa\x9a'),u'\ubcf8\u20dd\uf87a':'\xab\x89', +u'\ubd80':(2,'\xba\xce'),u'\ubd80\u20dd':'\xaa\x90',u'\ubd80\u20de':'\xaaG', +u'\ube44':(2,'\xba\xf1'),u'\ube44\u20dd':(3,'\xaa\x95'),u'\ube44\u20dd\uf87a': +'\xab\x86',u'\ube44\u20de':'\xaaL',u'\ube60':(2,'\xba\xfc'),u'\ube60\u20dd': +(3,'\xabn'),u'\ube60\u20dd\uf87a':'\xab\x88',u'\uc0ac':(2,'\xbb\xe7'), +u'\uc0ac\u20dd':(3,'\xaa\x84'),u'\uc0ac\u20dd\uf87a':'\xab{',u'\uc0c1': +(2,'\xbb\xf3'),u'\uc0c1\u20dd':'\xabJ',u'\uc13c':(2,'\xbc\xbe'),u'\uc13c\u20dd' +:(3,'\xabK'),u'\uc13c\u20dd\uf87a':'\xab\x8b',u'\uc18c':(2,'\xbc\xd2'), +u'\uc18c\u20dd':'\xac\x93',u'\uc18d':(2,'\xbc\xd3'),u'\uc18d\u20dd':'\xaa\x98', +u'\uc218':(2,'\xbc\xf6'),u'\uc218\u20dd':'\xaa\x93',u'\uc218\u20de':'\xaaJ', +u'\uc219':(2,'\xbc\xf7'),u'\uc219\u20dd':'\xaa\x9c',u'\uc2dc':(2,'\xbd\xc3'), +u'\uc2dc\u20dd':(3,'\xabo'),u'\uc2dc\u20dd\uf87a':'\xab\x8c',u'\uc2e0': +(2,'\xbd\xc5'),u'\uc2e0\u20dd':'\xabL',u'\uc2e4':(2,'\xbd\xc7'),u'\uc2e4\u20dd' +:'\xabW',u'\uc544':(2,'\xbe\xc6'),u'\uc544\u20dd':(3,'\xaa\x85'), +u'\uc544\u20dd\uf87a':'\xab|',u'\uc57d':(2,'\xbe\xe0'),u'\uc57d\u20dd': +'\xaa\x9b',u'\uc57d\u20de':'\xaaQ',u'\uc5ec':(2,'\xbf\xa9'),u'\uc5ec\u20dd': +(3,'\xabM'),u'\uc5ec\u20dd\uf87a':'\xab\x8d',u'\uc5ed':(2,'\xbf\xaa'), +u'\uc5ed\u20de':3,u'\uc5ed\u20de\uf87a':'\xaax',u'\uc608':(2,'\xbf\xb9'), +u'\uc608\u20dd':(3,'\xabN'),u'\uc608\u20dd\uf87a':'\xab\x8e',u'\uc608\u20de': +(3,'\xaaV'),u'\uc608\u20de\uf87a':'\xaa|',u'\uc678':(2,'\xbf\xdc'), +u'\uc678\u20dd':(3,'\xabS'),u'\uc678\u20dd\uf87a':'\xab\x9f',u'\uc6b4': +(2,'\xbf\xee'),u'\uc6b4\u20de':'\xaaA',u'\uc6d0':(2,'\xbf\xf8'),u'\uc6d0\u20dd' +:'\xabO',u'\uc720':(2,'\xc0\xaf'),u'\uc720\u20dd':'\xaa\x9d',u'\uc73c': +(2,'\xc0\xb8'),u'\uc73c\u20dd':(3,'\xabq'),u'\uc73c\u20dd\uf87a':'\xab\x8f', +u'\uc74c':(2,'\xc0\xbd'),u'\uc74c\u20dd':(3,'\xabr'),u'\uc74c\u20dd\uf87a': +'\xab\x90',u'\uc74c\u20de':3,u'\uc74c\u20de\uf87a':'\xaay',u'\uc774': +(2,'\xc0\xcc'),u'\uc774\u20dd':'\xac\x96',u'\uc778':(2,'\xc0\xce'), +u'\uc778\u20dd':'\xaa\x99',u'\uc778\u20de':'\xaaR',u'\uc77c':(2,'\xc0\xcf'), +u'\uc77c\u20dd':'\xac\x95',u'\uc785':(2,'\xc0\xd4'),u'\uc785\u20dd':(3,'\xabp') +,u'\uc785\u20dd\uf87a':'\xab\x91',u'\uc790':(2,'\xc0\xda'),u'\uc790\u20dd': +(3,'\xaa\x86'),u'\uc790\u20dd\uf87a':'\xab}',u'\uc790\u20de':'\xaaN',u'\uc791': +(2,'\xc0\xdb'),u'\uc791\u20dd':'\xabP',u'\uc804':(2,'\xc0\xfc'),u'\uc804\u20dd' +:'\xaa\x91',u'\uc804\u20de':'\xaaH',u'\uc811':(2,'\xc1\xa2'),u'\uc811\u20dd': +'\xaa\x92',u'\uc811\u20de':'\xaaI',u'\uc815':(2,'\xc1\xa4'),u'\uc815\u20de':3, +u'\uc815\u20de\uf87a':'\xaaz',u'\uc81c':(2,'\xc1\xa6'),u'\uc81c\u20dd':3, +u'\uc81c\u20dd\uf87a':'\xab\x92',u'\uc870':(2,'\xc1\xb6'),u'\uc870\u20dd': +'\xabA',u'\uc870\u20de':'\xaaq',u'\uc874':(2,'\xc1\xb8'),u'\uc874\u20dd': +(3,'\xaa}'),u'\uc874\u20dd\uf87a':'\xab\x93',u'\uc8fc':(2,'\xc1\xd6'), +u'\uc8fc\u20de':(3,'\xaaC'),u'\uc8fc\u20de\uf87a':'\xaat',u'\uc900': +(2,'\xc1\xd8'),u'\uc900\u20dd':(3,'\xabQ'),u'\uc900\u20dd\uf87a':'\xab\x94', +u'\uc911':(2,'\xc1\xdf'),u'\uc911\u20dd':'\xac\x94',u'\uc9c1':(2,'\xc1\xf7'), +u'\uc9c1\u20dd':'\xabs',u'\ucc28':(2,'\xc2\xf7'),u'\ucc28\u20dd':(3,'\xaa\x87') +,u'\ucc28\u20dd\uf87a':'\xab\x81',u'\ucc38':(2,'\xc2\xfc'),u'\ucc38\u20dd': +'\xac\x92',u'\uce74':(2,'\xc4\xab'),u'\uce74\u20dd':(3,'\xaa\x88'), +u'\uce74\u20dd\uf87a':'\xab\x82',u'\ud0b9':(2,'\xc5\xb7'),u'\ud0b9\u20dd': +'\xabR',u'\ud0c0':(2,'\xc5\xb8'),u'\ud0c0\u20dd':(3,'\xaa\x89'), +u'\ud0c0\u20dd\uf87a':'\xab\x83',u'\ud0c0\u20de':'\xaaO',u'\ud30c': +(2,'\xc6\xc4'),u'\ud30c\u20dd':(3,'\xaa\x8a'),u'\ud30c\u20dd\uf87a':'\xab\x84', +u'\ud45c':(2,'\xc7\xa5'),u'\ud45c\u20dd':(3,'\xabt'),u'\ud45c\u20dd\uf87a': +'\xab\x95',u'\ud558':(2,'\xc7\xcf'),u'\ud558\u20dd':(3,'\xabx'), +u'\ud558\u20dd\uf87a':'\xab\x85',u'\ud574':(2,'\xc7\xd8'),u'\ud574\u20dd':3, +u'\ud574\u20dd\uf87a':'\xab\x96',u'\ud574\u20de':3,u'\ud574\u20de\uf87a': +'\xaa{',u'\ud615':(2,'\xc7\xfc'),u'\ud615\u20dd':'\xaa\x8f',u'\ud615\u20de': +'\xaaF',u'\ud65c':(2,'\xc8\xb0'),u'\ud65c\u20dd':'\xabT',u'\ud734': +(2,'\xc8\xde'),u'\ud734\u20dd':'\xac\x97',u'\uf805':(2,'\xa6X'),u'\uf805\u20de' +:'\xa6f',u'\uf806':(2,'\xa6c'),u'\uf806\u20df':'\xa6`',u'\uf807':'\xa6\x9f', +u'\uf808':'\xa6\x8f',u'\uf809':(2,'\xa6\x81'),u'\uf809\uf87a':'\xa6\x91', +u'\uf80a':'\xa6t',u'\uf80b':(2,'\xa6\x96'),u'\uf80b\uf87f':'\xa6\x86',u'\uf80c' +:'\xa6\x9a',u'\uf83d':(2,'\xa6B'),u'\uf83d\uf87f':'\xa6A',u'\uf840':'\xa1n', +u'\uf841':'\xa8\x94',u'\uf842':'\xacT',u'\uf843':'\xacB',u'\uf844':'\xacI', +u'\uf845':'\xac_',u'\uf846':'\xa8g',u'\uf847':'\xa8h',u'\uf848':'\xa8\x9d', +u'\uf849':'\xa8\x9c',u'\uf84a':'\xacK',u'\uf84b':'\xacJ',u'\uf84c':'\xa7G', +u'\uf84d':'\xa7K',u'\uf84e':'\xa7L',u'\uf84f':'\xa7M',u'\uf860':2,u'\uf860*':3, +u'\uf860**':'\xa6L',u'\uf860A':3,u'\uf860A)':'\xa5U',u'\uf860A.':'\xa9A', +u'\uf860B':3,u'\uf860B)':'\xa5V',u'\uf860B.':'\xa9B',u'\uf860C':3,u'\uf860C)': +'\xa5W',u'\uf860C.':'\xa9C',u'\uf860D':3,u'\uf860D)':'\xa5X',u'\uf860D.': +'\xa9D',u'\uf860E':3,u'\uf860E)':'\xa5Y',u'\uf860E.':'\xa9E',u'\uf860F':3, +u'\uf860F)':'\xa5Z',u'\uf860F.':'\xa9F',u'\uf860G':3,u'\uf860G)':'\xa5[', +u'\uf860G.':'\xa9G',u'\uf860H':3,u'\uf860H)':'\xa5\\',u'\uf860H.':'\xa9H', +u'\uf860I':3,u'\uf860I)':'\xa5]',u'\uf860I.':'\xa9I',u'\uf860J':3,u'\uf860J)': +'\xa5^',u'\uf860J.':'\xa9J',u'\uf860K':3,u'\uf860K)':'\xa5_',u'\uf860K.': +'\xa9K',u'\uf860L':3,u'\uf860L)':'\xa5`',u'\uf860L.':'\xa9L',u'\uf860M':3, +u'\uf860M)':'\xa5a',u'\uf860M.':'\xa9M',u'\uf860N':3,u'\uf860N)':'\xa5b', +u'\uf860N.':'\xa9N',u'\uf860O':3,u'\uf860O)':'\xa5c',u'\uf860O.':'\xa9O', +u'\uf860P':3,u'\uf860P)':'\xa5d',u'\uf860P.':'\xa9P',u'\uf860Q':3,u'\uf860Q)': +'\xa5e',u'\uf860Q.':'\xa9Q',u'\uf860R':3,u'\uf860R)':'\xa5f',u'\uf860R.': +'\xa9R',u'\uf860S':3,u'\uf860S)':'\xa5g',u'\uf860S.':'\xa9S',u'\uf860T':3, +u'\uf860T)':'\xa5h',u'\uf860T.':'\xa9T',u'\uf860U':3,u'\uf860U)':'\xa5i', +u'\uf860U.':'\xa9U',u'\uf860V':3,u'\uf860V)':'\xa5j',u'\uf860V.':'\xa9V', +u'\uf860W':3,u'\uf860W)':'\xa5k',u'\uf860W.':'\xa9W',u'\uf860X':3,u'\uf860X)': +'\xa5l',u'\uf860X.':'\xa9X',u'\uf860Y':3,u'\uf860Y)':'\xa5m',u'\uf860Y.': +'\xa9Y',u'\uf860Z':3,u'\uf860Z)':'\xa5n',u'\uf860Z.':'\xa9Z',u'\uf860a':3, +u'\uf860a)':'\xa5o',u'\uf860a.':'\xa9[',u'\uf860b':3,u'\uf860b)':'\xa5p', +u'\uf860b.':'\xa9\\',u'\uf860c':3,u'\uf860c)':'\xa5q',u'\uf860c.':'\xa9]', +u'\uf860d':3,u'\uf860d)':'\xa5r',u'\uf860d.':'\xa9^',u'\uf860e':3,u'\uf860e)': +'\xa5s',u'\uf860e.':'\xa9_',u'\uf860f':3,u'\uf860f)':'\xa5t',u'\uf860f.': +'\xa9`',u'\uf860g':3,u'\uf860g)':'\xa5u',u'\uf860g.':'\xa9a',u'\uf860h':3, +u'\uf860h)':'\xa5v',u'\uf860h.':'\xa9b',u'\uf860i':3,u'\uf860i)':'\xa5w', +u'\uf860i.':'\xa9c',u'\uf860j':3,u'\uf860j)':'\xa5x',u'\uf860j.':'\xa9d', +u'\uf860k':3,u'\uf860k)':'\xa5y',u'\uf860k.':'\xa9e',u'\uf860l':3,u'\uf860l)': +'\xa5z',u'\uf860l.':'\xa9f',u'\uf860m':3,u'\uf860m)':'\xa5{',u'\uf860m.': +'\xa9g',u'\uf860n':3,u'\uf860n)':'\xa5|',u'\uf860n.':'\xa9h',u'\uf860o':3, +u'\uf860o)':'\xa5}',u'\uf860o.':'\xa9i',u'\uf860p':3,u'\uf860p)':'\xa5\x81', +u'\uf860p.':'\xa9j',u'\uf860q':3,u'\uf860q)':'\xa5\x82',u'\uf860q.':'\xa9k', +u'\uf860r':3,u'\uf860r)':'\xa5\x83',u'\uf860r.':'\xa9l',u'\uf860s':3, +u'\uf860s)':'\xa5\x84',u'\uf860s.':'\xa9m',u'\uf860t':3,u'\uf860t)':'\xa5\x85', +u'\uf860t.':'\xa9n',u'\uf860u':3,u'\uf860u)':'\xa5\x86',u'\uf860u.':'\xa9o', +u'\uf860v':3,u'\uf860v)':'\xa5\x87',u'\uf860v.':'\xa9p',u'\uf860w':3, +u'\uf860w)':'\xa5\x88',u'\uf860w.':'\xa9q',u'\uf860x':3,u'\uf860x)':'\xa5\x89', +u'\uf860x.':'\xa9r',u'\uf860y':3,u'\uf860y)':'\xa5\x8a',u'\uf860y.':'\xa9s', +u'\uf860z':3,u'\uf860z)':'\xa5\x8b',u'\uf860z.':'\xa9t',u'\uf860\u2020':3, +u'\uf860\u2020\u2020':'\xa6D',u'\uf860\u2021':3,u'\uf860\u2021\u2021':'\xa6E', +u'\uf861':2,u'\uf861(':3,u'\uf861(A':4,u'\uf861(A)':'\xa3i',u'\uf861(B':4, +u'\uf861(B)':'\xa3j',u'\uf861(C':4,u'\uf861(C)':'\xa3k',u'\uf861(D':4, +u'\uf861(D)':'\xa3l',u'\uf861(E':4,u'\uf861(E)':'\xa3m',u'\uf861(F':4, +u'\uf861(F)':'\xa3n',u'\uf861(G':4,u'\uf861(G)':'\xa3o',u'\uf861(H':4, +u'\uf861(H)':'\xa3p',u'\uf861(I':4,u'\uf861(I)':'\xa3q',u'\uf861(J':4, +u'\uf861(J)':'\xa3r',u'\uf861(K':4,u'\uf861(K)':'\xa3s',u'\uf861(L':4, +u'\uf861(L)':'\xa3t',u'\uf861(M':4,u'\uf861(M)':'\xa3u',u'\uf861(N':4, +u'\uf861(N)':'\xa3v',u'\uf861(O':4,u'\uf861(O)':'\xa3w',u'\uf861(P':4, +u'\uf861(P)':'\xa3x',u'\uf861(Q':4,u'\uf861(Q)':'\xa3y',u'\uf861(R':4, +u'\uf861(R)':'\xa3z',u'\uf861(S':4,u'\uf861(S)':'\xa3{',u'\uf861(T':4, +u'\uf861(T)':'\xa3|',u'\uf861(U':4,u'\uf861(U)':'\xa3}',u'\uf861(V':4, +u'\uf861(V)':'\xa3\x81',u'\uf861(W':4,u'\uf861(W)':'\xa3\x82',u'\uf861(X':4, +u'\uf861(X)':'\xa3\x83',u'\uf861(Y':4,u'\uf861(Y)':'\xa3\x84',u'\uf861(Z':4, +u'\uf861(Z)':'\xa3\x85',u'\uf861\u2020':3,u'\uf861\u2020\u2020':4, +u'\uf861\u2020\u2020\u2020':'\xa6F',u'\uf862':2,u'\uf862(':3,u'\uf862(2':4, +u'\uf862(21':5,u'\uf862(21)':'\xaa\xf9',u'\uf862(22':5,u'\uf862(22)':'\xaa\xfa' +,u'\uf862(23':5,u'\uf862(23)':'\xaa\xfb',u'\uf862(24':5,u'\uf862(24)': +'\xaa\xfc',u'\uf862(25':5,u'\uf862(25)':'\xaa\xfd',u'\uf862(26':5,u'\uf862(26)' +:'\xaa\xfe',u'\uf862(27':5,u'\uf862(27)':'\xab\xf7',u'\uf862(28':5, +u'\uf862(28)':'\xab\xf8',u'\uf862(29':5,u'\uf862(29)':'\xab\xf9',u'\uf862(3':4, +u'\uf862(30':5,u'\uf862(30)':'\xab\xfa',u'\uf862[':3,u'\uf862[1':4,u'\uf862[10' +:5,u'\uf862[10]':'\xa4J',u'\uf862[11':5,u'\uf862[11]':'\xa4K',u'\uf862[12':5, +u'\uf862[12]':'\xa4L',u'\uf862[13':5,u'\uf862[13]':'\xa4M',u'\uf862[14':5, +u'\uf862[14]':'\xa4N',u'\uf862[15':5,u'\uf862[15]':'\xa4O',u'\uf862[16':5, +u'\uf862[16]':'\xa4P',u'\uf862[17':5,u'\uf862[17]':'\xa4Q',u'\uf862[18':5, +u'\uf862[18]':'\xa4R',u'\uf862[19':5,u'\uf862[19]':'\xa4S',u'\uf862[2':4, +u'\uf862[20':5,u'\uf862[20]':'\xa4T',u'\uf862[\u4e8c':4,u'\uf862[\u4e8c\u5341': +5,u'\uf862[\u4e8c\u5341]':'\xadh',u'\uf862[\u5341':4,u'\uf862[\u5341\u4e00':5, +u'\uf862[\u5341\u4e00]':'\xad_',u'\uf862[\u5341\u4e03':5, +u'\uf862[\u5341\u4e03]':'\xade',u'\uf862[\u5341\u4e09':5, +u'\uf862[\u5341\u4e09]':'\xada',u'\uf862[\u5341\u4e5d':5, +u'\uf862[\u5341\u4e5d]':'\xadg',u'\uf862[\u5341\u4e8c':5, +u'\uf862[\u5341\u4e8c]':'\xad`',u'\uf862[\u5341\u4e94':5, +u'\uf862[\u5341\u4e94]':'\xadc',u'\uf862[\u5341\u516b':5, +u'\uf862[\u5341\u516b]':'\xadf',u'\uf862[\u5341\u516d':5, +u'\uf862[\u5341\u516d]':'\xadd',u'\uf862[\u5341\u56db':5, +u'\uf862[\u5341\u56db]':'\xadb',u'\uf862\uc8fc':3,u'\uf862\uc8fc\uc2dd':4, +u'\uf862\uc8fc\uc2dd\ud68c':5,u'\uf862\uc8fc\uc2dd\ud68c\uc0ac':'\xa7}', +u'\uf863':2,u'\uf863[':3,u'\uf863[1':4,u'\uf863[10':5,u'\uf863[10]':'\xa2\xef', +u'\uf863[11':5,u'\uf863[11]':'\xa2\xf0',u'\uf863[12':5,u'\uf863[12]':'\xa2\xf1' +,u'\uf863[13':5,u'\uf863[13]':'\xa2\xf2',u'\uf863[14':5,u'\uf863[14]': +'\xa2\xf3',u'\uf863[15':5,u'\uf863[15]':'\xa2\xf4',u'\uf863[16':5,u'\uf863[16]' +:'\xa2\xf5',u'\uf863[17':5,u'\uf863[17]':'\xa2\xf6',u'\uf863[18':5, +u'\uf863[18]':'\xa2\xf7',u'\uf863[19':5,u'\uf863[19]':'\xa2\xf8',u'\uf863[2':4, +u'\uf863[20':5,u'\uf863[20]':'\xa2\xf9',u'\uf863[\u4e8c':4, +u'\uf863[\u4e8c\u5341':5,u'\uf863[\u4e8c\u5341]':'\xadT',u'\uf863[\u5341':4, +u'\uf863[\u5341\u4e00':5,u'\uf863[\u5341\u4e00]':'\xadK',u'\uf863[\u5341\u4e03' +:5,u'\uf863[\u5341\u4e03]':'\xadQ',u'\uf863[\u5341\u4e09':5, +u'\uf863[\u5341\u4e09]':'\xadM',u'\uf863[\u5341\u4e5d':5, +u'\uf863[\u5341\u4e5d]':'\xadS',u'\uf863[\u5341\u4e8c':5, +u'\uf863[\u5341\u4e8c]':'\xadL',u'\uf863[\u5341\u4e94':5, +u'\uf863[\u5341\u4e94]':'\xadO',u'\uf863[\u5341\u516b':5, +u'\uf863[\u5341\u516b]':'\xadR',u'\uf863[\u5341\u516d':5, +u'\uf863[\u5341\u516d]':'\xadP',u'\uf863[\u5341\u56db':5, +u'\uf863[\u5341\u56db]':'\xadN',u'\uf863\uc8fc':3,u'\uf863\uc8fc\uc2dd':4, +u'\uf863\uc8fc\uc2dd\ud68c':5,u'\uf863\uc8fc\uc2dd\ud68c\uc0ac':'\xa7\x81', +u'\uf864':2,u'\uf864[':3,u'\uf864[1':4,u'\uf864[10':5,u'\uf864[10]':'\xa3J', +u'\uf864[11':5,u'\uf864[11]':'\xa3K',u'\uf864[12':5,u'\uf864[12]':'\xa3L', +u'\uf864[13':5,u'\uf864[13]':'\xa3M',u'\uf864[14':5,u'\uf864[14]':'\xa3N', +u'\uf864[15':5,u'\uf864[15]':'\xa3O',u'\uf864[16':5,u'\uf864[16]':'\xa3P', +u'\uf864[17':5,u'\uf864[17]':'\xa3Q',u'\uf864[18':5,u'\uf864[18]':'\xa3R', +u'\uf864[19':5,u'\uf864[19]':'\xa3S',u'\uf864[2':4,u'\uf864[20':5,u'\uf864[20]' +:'\xa3T',u'\uf865':2,u'\uf865[':3,u'\uf865[1':4,u'\uf865[10':5,u'\uf865[10]': +'\xa4^',u'\uf865[11':5,u'\uf865[11]':'\xa4_',u'\uf865[12':5,u'\uf865[12]': +'\xa4`',u'\uf865[13':5,u'\uf865[13]':'\xa4a',u'\uf865[14':5,u'\uf865[14]': +'\xa4b',u'\uf865[15':5,u'\uf865[15]':'\xa4c',u'\uf865[16':5,u'\uf865[16]': +'\xa4d',u'\uf865[17':5,u'\uf865[17]':'\xa4e',u'\uf865[18':5,u'\uf865[18]': +'\xa4f',u'\uf865[19':5,u'\uf865[19]':'\xa4g',u'\uf865[2':4,u'\uf865[20':5, +u'\uf865[20]':'\xa4h',u'\uf866':2,u'\uf866[':3,u'\uf866[1':4,u'\uf866[10':5, +u'\uf866[10]':'\xac\xcb',u'\uf866[11':5,u'\uf866[11]':'\xac\xcc',u'\uf866[12':5 +,u'\uf866[12]':'\xac\xcd',u'\uf866[13':5,u'\uf866[13]':'\xac\xce',u'\uf866[14': +5,u'\uf866[14]':'\xac\xcf',u'\uf866[15':5,u'\uf866[15]':'\xac\xd0',u'\uf866[16' +:5,u'\uf866[16]':'\xac\xf2',u'\uf866[17':5,u'\uf866[17]':'\xac\xf3', +u'\uf866[18':5,u'\uf866[18]':'\xac\xf4',u'\uf866[19':5,u'\uf866[19]':'\xac\xf5' +,u'\uf866[2':4,u'\uf866[20':5,u'\uf866[20]':'\xac\xf6',u'\uf867':2,u'\uf867*':3 +,u'\uf867**':'\xa6P',u'\ufe59':(2,'\xa1M'),u'\ufe59\uf87c':'\xa2E', +u'\ufe59\uf87f':'\xa1O',u'\ufe5a':(2,'\xa1N'),u'\ufe5a\uf87c':'\xa2F', +u'\ufe5a\uf87f':'\xa1P',u'\uff01':(2,'\xa3\xa1'),u'\uff01\uf874':'\xa5\xda', +u'\uff0a':(2,'\xa3\xaa'),u'\uff0a\uf871':'\xa1\x9f',u'\uff0a\uf873':'\xa6J', +u'\uff0a\uf874':'\xa1\x9c',u'\uff0a\uf875':'\xa1\x9e',u'\uff0a\uf87f':'\xa6I', +u'\uff3f':(2,'\xa3\xdf'),u'\uff3f\uf87f':'\x84',u'\uff5e':None,u'\uffe0':None, +u'\uffe1':None,u'\uffe2':None,u'\uffe3':None,u'\uffe5':None +} + +decode_map = { +'\x80':u'\xa0','\x81':u'\u20a9','\x82':u'\u2013\uf87f','\x83':u'\xa9','\x84': +u'\uff3f\uf87f','\x85':u'\x85','\x86':u'\x86','\x87':u'\x87','\x88':u'\x88', +'\x89':u'\x89','\x8a':u'\x8a','\x8b':u'\x8b','\x8c':u'\x8c','\x8d':u'\x8d', +'\x8e':u'\x8e','\x8f':u'\x8f','\x90':u'\x90','\x91':u'\x91','\x92':u'\x92', +'\x93':u'\x93','\x94':u'\x94','\x95':u'\x95','\x96':u'\x96','\x97':u'\x97', +'\x98':u'\x98','\x99':u'\x99','\x9a':u'\x9a','\x9b':u'\x9b','\x9c':u'\x9c', +'\x9d':u'\x9d','\x9e':u'\x9e','\x9f':u'\x9f','\xa1':2,'\xa1A':u'\u300c\uf87f', +'\xa1B':u'\u300d\uf87f','\xa1C':u'\u300c\uf87b','\xa1D':u'\u300d\uf87b','\xa1E' +:u'\u300c\uf87c','\xa1F':u'\u300d\uf87c','\xa1G':u'\u300e\uf87c','\xa1H': +u'\u300f\uf87c','\xa1I':u'\u300a\uf878','\xa1J':u'\u300b\uf878','\xa1K': +u'\u3008\uf878','\xa1L':u'\u3009\uf878','\xa1M':u'\ufe59','\xa1N':u'\ufe5a', +'\xa1O':u'\ufe59\uf87f','\xa1P':u'\ufe5a\uf87f','\xa1Q':u'\u2985\uf87f','\xa1R' +:u'\u2986\uf87f','\xa1S':u'\u2985\uf879','\xa1T':u'\u2986\uf879','\xa1U': +u'\u2985\uf87c','\xa1V':u'\u2986\uf87c','\xa1W':u'(\uf87c','\xa1X':u')\uf87c', +'\xa1Y':u'\u2985','\xa1Z':u'\u2986','\xa1[':u'\u3010\uf87f','\xa1\\': +u'\u3011\uf87f','\xa1]':u'\u3016','\xa1^':u'\u3017','\xa1_':u'\u3018','\xa1`': +u'\u3019','\xa1a':u'[\uf87b','\xa1b':u']\uf87b','\xa1c':u'[\uf87c','\xa1d': +u']\uf87c','\xa1e':u'\u2985\uf87b','\xa1f':u'\u2986\uf87b','\xa1g': +u'\u2020\uf87f','\xa1h':u'\u2021\uf87f','\xa1i':u'\u2020\uf87b','\xa1j': +u'\u2021\uf87c','\xa1k':u'\u2020\uf877','\xa1l':u'*\uf877','\xa1m':u'\u2051', +'\xa1n':u'\uf840','\xa1o':u'\u201f','\xa1p':u'\u201b','\xa1q':u'\u207a','\xa1r' +:u'\u207b','\xa1s':u'\xd7\uf877','\xa1t':u'\u221e\uf877','\xa1u': +u'\u223d\uf877','\xa1v':u'\xb1\uf877','\xa1w':u'\u2213\uf877','\xa1x': +u'>\uf877','\xa1y':u'<\uf877','\xa1z':u'\u207c','\xa1{':u'\u2260\uf877','\xa1|' +:u'\u207d','\xa1}':u'\u207e','\xa1\x81':u'{\uf877','\xa1\x82':u'}\uf877', +'\xa1\x83':u'[\uf877','\xa1\x84':u']\uf877','\xa1\x85':u'\u2229\uf877', +'\xa1\x86':u'\u222a\uf877','\xa1\x87':u'\u2282\uf877','\xa1\x88': +u'\u2208\uf877','\xa1\x89':u'\u2211\uf877','\xa1\x8a':u'!\uf877','\xa1\x8b': +u'\u3007\uf876','\xa1\x8c':u'\u4e00\uf876','\xa1\x8d':u'\u4e8c\uf876', +'\xa1\x8e':u'\u4e09\uf876','\xa1\x8f':u'\u56db\uf876','\xa1\x90': +u'\u4e94\uf876','\xa1\x91':u'\u516d\uf876','\xa1\x92':u'\u4e03\uf876', +'\xa1\x93':u'\u516b\uf876','\xa1\x94':u'\u4e5d\uf876','\xa1\x95': +u'\u5341\uf876','\xa1\x96':u'\u204c','\xa1\x97':u'\u204d','\xa1\x98':u'\u02bc', +'\xa1\x99':u'\u2997','\xa1\x9a':u'\u2998','\xa1\x9c':u'\uff0a\uf874','\xa1\x9d' +:u'\u2051\uf87c','\xa1\x9e':u'\uff0a\uf875','\xa1\x9f':u'\uff0a\uf871', +'\xa1\xa0':u'\u2051\uf879','\xa1\xa9':u'\u2013','\xa1\xaa':u'\u2014','\xa1\xab' +:u'\u2016','\xa1\xad':u'\u301c','\xa1\xcb':u'\xa2','\xa1\xcc':u'\xa3', +'\xa1\xcd':u'\xa5','\xa1\xfe':u'\xac','\xa2':2,'\xa2A':u'\u2985\uf878','\xa2B': +u'\u2986\uf878','\xa2C':u'\u2985\uf873','\xa2D':u'\u2986\uf873','\xa2E': +u'\ufe59\uf87c','\xa2F':u'\ufe5a\uf87c','\xa2G':u'\u3016\uf878','\xa2H': +u'\u3017\uf878','\xa2I':u'\u3010\uf878','\xa2J':u'\u3011\uf878','\xa2K': +u'(\uf87f','\xa2L':u')\uf87f','\xa2\xa6':u'\u02dc','\xa2\xc1':u'\u25c9', +'\xa2\xe6':u'1\u20de\uf87c','\xa2\xe7':u'2\u20de\uf87c','\xa2\xe8': +u'3\u20de\uf87c','\xa2\xe9':u'4\u20de\uf87c','\xa2\xea':u'5\u20de\uf87c', +'\xa2\xeb':u'6\u20de\uf87c','\xa2\xec':u'7\u20de\uf87c','\xa2\xed': +u'8\u20de\uf87c','\xa2\xee':u'9\u20de\uf87c','\xa2\xef':u'\uf863[10]', +'\xa2\xf0':u'\uf863[11]','\xa2\xf1':u'\uf863[12]','\xa2\xf2':u'\uf863[13]', +'\xa2\xf3':u'\uf863[14]','\xa2\xf4':u'\uf863[15]','\xa2\xf5':u'\uf863[16]', +'\xa2\xf6':u'\uf863[17]','\xa2\xf7':u'\uf863[18]','\xa2\xf8':u'\uf863[19]', +'\xa2\xf9':u'\uf863[20]','\xa2\xfa':u'\xb6\uf87f','\xa2\xfb':u'\u2016\uf87b', +'\xa2\xfc':u'\u2016\uf87c','\xa2\xfd':u'\u22ee','\xa2\xfe':u'\u2237','\xa3':2, +'\xa3A':u'1\u20de\uf87b','\xa3B':u'2\u20de\uf87b','\xa3C':u'3\u20de\uf87b', +'\xa3D':u'4\u20de\uf87b','\xa3E':u'5\u20de\uf87b','\xa3F':u'6\u20de\uf87b', +'\xa3G':u'7\u20de\uf87b','\xa3H':u'8\u20de\uf87b','\xa3I':u'9\u20de\uf87b', +'\xa3J':u'\uf864[10]','\xa3K':u'\uf864[11]','\xa3L':u'\uf864[12]','\xa3M': +u'\uf864[13]','\xa3N':u'\uf864[14]','\xa3O':u'\uf864[15]','\xa3P':u'\uf864[16]' +,'\xa3Q':u'\uf864[17]','\xa3R':u'\uf864[18]','\xa3S':u'\uf864[19]','\xa3T': +u'\uf864[20]','\xa3U':u'\u278a','\xa3V':u'\u278b','\xa3W':u'\u278c','\xa3X': +u'\u278d','\xa3Y':u'\u278e','\xa3Z':u'\u278f','\xa3[':u'\u2790','\xa3\\': +u'\u2791','\xa3]':u'\u2792','\xa3^':u'\u2793','\xa3_':u'\u24eb\uf87f','\xa3`': +u'\u24ec\uf87f','\xa3a':u'\u24ed\uf87f','\xa3b':u'\u24ee\uf87f','\xa3c': +u'\u24ef\uf87f','\xa3d':u'\u24f0\uf87f','\xa3e':u'\u24f1\uf87f','\xa3f': +u'\u24f2\uf87f','\xa3g':u'\u24f3\uf87f','\xa3h':u'\u24f4\uf87f','\xa3i': +u'\uf861(A)','\xa3j':u'\uf861(B)','\xa3k':u'\uf861(C)','\xa3l':u'\uf861(D)', +'\xa3m':u'\uf861(E)','\xa3n':u'\uf861(F)','\xa3o':u'\uf861(G)','\xa3p': +u'\uf861(H)','\xa3q':u'\uf861(I)','\xa3r':u'\uf861(J)','\xa3s':u'\uf861(K)', +'\xa3t':u'\uf861(L)','\xa3u':u'\uf861(M)','\xa3v':u'\uf861(N)','\xa3w': +u'\uf861(O)','\xa3x':u'\uf861(P)','\xa3y':u'\uf861(Q)','\xa3z':u'\uf861(R)', +'\xa3{':u'\uf861(S)','\xa3|':u'\uf861(T)','\xa3}':u'\uf861(U)','\xa3\x81': +u'\uf861(V)','\xa3\x82':u'\uf861(W)','\xa3\x83':u'\uf861(X)','\xa3\x84': +u'\uf861(Y)','\xa3\x85':u'\uf861(Z)','\xa3\x86':u'\u24b6','\xa3\x87':u'\u24b7', +'\xa3\x88':u'\u24b8','\xa3\x89':u'\u24b9','\xa3\x8a':u'\u24ba','\xa3\x8b': +u'\u24bb','\xa3\x8c':u'\u24bc','\xa3\x8d':u'\u24bd','\xa3\x8e':u'\u24be', +'\xa3\x8f':u'\u24bf','\xa3\x90':u'\u24c0','\xa3\x91':u'\u24c1','\xa3\x92': +u'\u24c2','\xa3\x93':u'\u24c3','\xa3\x94':u'\u24c4','\xa3\x95':u'\u24c5', +'\xa3\x96':u'\u24c6','\xa3\x97':u'\u24c7','\xa3\x98':u'\u24c8','\xa3\x99': +u'\u24c9','\xa3\x9a':u'\u24ca','\xa3\x9b':u'\u24cb','\xa3\x9c':u'\u24cc', +'\xa3\x9d':u'\u24cd','\xa3\x9e':u'\u24ce','\xa3\x9f':u'\u24cf','\xa3\xfe': +u'\u203e','\xa4':2,'\xa4A':u'1\u20de\uf87f','\xa4B':u'2\u20de\uf87f','\xa4C': +u'3\u20de\uf87f','\xa4D':u'4\u20de\uf87f','\xa4E':u'5\u20de\uf87f','\xa4F': +u'6\u20de\uf87f','\xa4G':u'7\u20de\uf87f','\xa4H':u'8\u20de\uf87f','\xa4I': +u'9\u20de\uf87f','\xa4J':u'\uf862[10]','\xa4K':u'\uf862[11]','\xa4L': +u'\uf862[12]','\xa4M':u'\uf862[13]','\xa4N':u'\uf862[14]','\xa4O':u'\uf862[15]' +,'\xa4P':u'\uf862[16]','\xa4Q':u'\uf862[17]','\xa4R':u'\uf862[18]','\xa4S': +u'\uf862[19]','\xa4T':u'\uf862[20]','\xa4U':u'1\u20de\uf87a','\xa4V': +u'2\u20de\uf87a','\xa4W':u'3\u20de\uf87a','\xa4X':u'4\u20de\uf87a','\xa4Y': +u'5\u20de\uf87a','\xa4Z':u'6\u20de\uf87a','\xa4[':u'7\u20de\uf87a','\xa4\\': +u'8\u20de\uf87a','\xa4]':u'9\u20de\uf87a','\xa4^':u'\uf865[10]','\xa4_': +u'\uf865[11]','\xa4`':u'\uf865[12]','\xa4a':u'\uf865[13]','\xa4b':u'\uf865[14]' +,'\xa4c':u'\uf865[15]','\xa4d':u'\uf865[16]','\xa4e':u'\uf865[17]','\xa4f': +u'\uf865[18]','\xa4g':u'\uf865[19]','\xa4h':u'\uf865[20]','\xa4i': +u'\u278a\uf87f','\xa4j':u'\u278b\uf87f','\xa4k':u'\u278c\uf87f','\xa4l': +u'\u278d\uf87f','\xa4m':u'\u278e\uf87f','\xa4n':u'\u278f\uf87f','\xa4o': +u'\u2790\uf87f','\xa4p':u'\u2791\uf87f','\xa4q':u'\u2792\uf87f','\xa4r': +u'\u2793\uf87f','\xa4s':u'\u24eb\uf878','\xa4t':u'\u24ec\uf878','\xa4u': +u'\u24ed\uf878','\xa4v':u'\u24ee\uf878','\xa4w':u'\u24ef\uf878','\xa4x': +u'\u24f0\uf878','\xa4y':u'\u24f1\uf878','\xa4z':u'\u24f2\uf878','\xa4{': +u'\u24f3\uf878','\xa4|':u'\u24f4\uf878','\xa4}':u'\u2a26','\xa4\x81':u'\u227a', +'\xa4\x82':u'\u227b','\xa4\x83':u'\u22ce','\xa4\x84':u'\u22cf','\xa4\x85': +u'\u2280','\xa4\x86':u'\u2281','\xa4\x87':u'\u2270','\xa4\x88':u'\u2271', +'\xa4\x89':u'\u2272','\xa4\x8a':u'\u2273','\xa4\x8b':u'\u2ac5','\xa4\x8c': +u'\u2acb','\xa4\x8d':u'\u2ac6','\xa4\x8e':u'\u2acc','\xa4\x8f':u'\u2276', +'\xa4\x90':u'\u2277','\xa4\x91':u'\u2279','\xa4\x92':u'\u22da','\xa4\x93': +u'\u22db','\xa4\x94':u'\u2a8b','\xa4\x95':u'\u2a8c','\xa4\x96':u'\u2a91', +'\xa4\x97':u'\u2a92','\xa4\x98':u'\u2222\uf87f','\xa4\x99':u'\u2245','\xa4\x9a' +:u'\u2243','\xa4\x9b':u'\u2248','\xa4\x9c':u'\u29a3','\xa4\x9d':u'\u22a4', +'\xa4\x9e':u'\u2225\u0347','\xa4\x9f':u'\u2afd\u0347','\xa5':2,'\xa5A': +u'0\u20de','\xa5B':u'1\u20de','\xa5C':u'2\u20de','\xa5D':u'3\u20de','\xa5E': +u'4\u20de','\xa5F':u'5\u20de','\xa5G':u'6\u20de','\xa5H':u'7\u20de','\xa5I': +u'8\u20de','\xa5J':u'9\u20de','\xa5K':u'\u24ea\uf87f','\xa5L':u'\u2460\uf87f', +'\xa5M':u'\u2461\uf87f','\xa5N':u'\u2462\uf87f','\xa5O':u'\u2463\uf87f','\xa5P' +:u'\u2464\uf87f','\xa5Q':u'\u2465\uf87f','\xa5R':u'\u2466\uf87f','\xa5S': +u'\u2467\uf87f','\xa5T':u'\u2468\uf87f','\xa5U':u'\uf860A)','\xa5V':u'\uf860B)' +,'\xa5W':u'\uf860C)','\xa5X':u'\uf860D)','\xa5Y':u'\uf860E)','\xa5Z': +u'\uf860F)','\xa5[':u'\uf860G)','\xa5\\':u'\uf860H)','\xa5]':u'\uf860I)', +'\xa5^':u'\uf860J)','\xa5_':u'\uf860K)','\xa5`':u'\uf860L)','\xa5a':u'\uf860M)' +,'\xa5b':u'\uf860N)','\xa5c':u'\uf860O)','\xa5d':u'\uf860P)','\xa5e': +u'\uf860Q)','\xa5f':u'\uf860R)','\xa5g':u'\uf860S)','\xa5h':u'\uf860T)','\xa5i' +:u'\uf860U)','\xa5j':u'\uf860V)','\xa5k':u'\uf860W)','\xa5l':u'\uf860X)', +'\xa5m':u'\uf860Y)','\xa5n':u'\uf860Z)','\xa5o':u'\uf860a)','\xa5p':u'\uf860b)' +,'\xa5q':u'\uf860c)','\xa5r':u'\uf860d)','\xa5s':u'\uf860e)','\xa5t': +u'\uf860f)','\xa5u':u'\uf860g)','\xa5v':u'\uf860h)','\xa5w':u'\uf860i)','\xa5x' +:u'\uf860j)','\xa5y':u'\uf860k)','\xa5z':u'\uf860l)','\xa5{':u'\uf860m)', +'\xa5|':u'\uf860n)','\xa5}':u'\uf860o)','\xa5\x81':u'\uf860p)','\xa5\x82': +u'\uf860q)','\xa5\x83':u'\uf860r)','\xa5\x84':u'\uf860s)','\xa5\x85': +u'\uf860t)','\xa5\x86':u'\uf860u)','\xa5\x87':u'\uf860v)','\xa5\x88': +u'\uf860w)','\xa5\x89':u'\uf860x)','\xa5\x8a':u'\uf860y)','\xa5\x8b': +u'\uf860z)','\xa5\xda':u'\uff01\uf874','\xa5\xdb':u'\u3002\uf87d','\xa5\xdc': +u'\u2032\uf87f','\xa5\xdd':u'\u2033\uf87f','\xa5\xde':u'\u2034','\xa5\xf9': +u'\u3257\uf87a','\xa5\xfa':u'\u3258\uf87a','\xa5\xfb':u'\u3259\uf87a', +'\xa5\xfc':u'\u325a\uf87a','\xa6':2,'\xa6A':u'\uf83d\uf87f','\xa6B':u'\uf83d', +'\xa6C':u'\u2020\uf87c','\xa6D':u'\uf860\u2020\u2020','\xa6E': +u'\uf860\u2021\u2021','\xa6F':u'\uf861\u2020\u2020\u2020','\xa6G':u'\xa7\uf87c' +,'\xa6H':u'\u266f','\xa6I':u'\uff0a\uf87f','\xa6J':u'\uff0a\uf873','\xa6K': +u'\u2051\uf874','\xa6L':u'\uf860**','\xa6M':u'\u2042','\xa6N':u'\u204e','\xa6O' +:u'\u2051\uf871','\xa6P':u'\uf867**','\xa6Q':u'\u2042\uf879','\xa6R':u'\u273d', +'\xa6S':u'\u2731','\xa6T':u'\u2747','\xa6U':u'\u2022','\xa6V':u'\u25a0\u20df', +'\xa6W':u'\u25c7\u20df','\xa6X':u'\uf805','\xa6Y':u'\u25a1\u20df','\xa6Z': +u'\u2039','\xa6[':u'\u203a','\xa6\\':u'\xab','\xa6]':u'\xbb','\xa6^': +u'\u261c\uf87f','\xa6_':u'\u261e\uf87f','\xa6`':u'\uf806\u20df','\xa6a': +u'\u25c7\u20df\u20df','\xa6b':u'\u25c7\u20de','\xa6c':u'\uf806','\xa6d': +u'\u29c8','\xa6e':u'\u25c6\u20de','\xa6f':u'\uf805\u20de','\xa6g': +u'\u29c8\u20de','\xa6h':u'\u29be','\xa6i':u'\u25ce\u20dd','\xa6j': +u'\u25b3\u20dd','\xa6k':u'\u25b2\u20dd','\xa6l':u'\u271a','\xa6m':u'\u2716', +'\xa6n':u'\u29bf','\xa6o':u'\u25ef','\xa6p':u'\u25ef\uf87c','\xa6q': +u'\u2610\uf87c','\xa6r':u'\u2723','\xa6s':u'\u2756','\xa6t':u'\uf80a','\xa6u': +u'\u25cc','\xa6v':u'\u2610\uf87f','\xa6w':u'\u2610','\xa6x':u'\u25a2','\xa6y': +u'\u2723\uf87a','\xa6z':u'\u2756\uf87a','\xa6{':u'\u273f\uf87a','\xa6|': +u'\u273f','\xa6}':u'\u3013\uf87c','\xa6\x81':u'\uf809','\xa6\x82': +u'\u25c9\u20dd','\xa6\x83':u'\u274d','\xa6\x84':u'\u25cd','\xa6\x85': +u'\u27e1\u20dd','\xa6\x86':u'\uf80b\uf87f','\xa6\x87':u'\u2720\uf87a', +'\xa6\x88':u'\u2720','\xa6\x89':u'\u25c8\uf87f','\xa6\x8a':u'\u25a8\uf87f', +'\xa6\x8d':u'\u2741','\xa6\x8e':u'\u2756\uf87f','\xa6\x8f':u'\uf808','\xa6\x90' +:u'\u20a9\uf87f','\xa6\x91':u'\uf809\uf87a','\xa6\x92':u'\u534d\uf87f', +'\xa6\x93':u'\u262f','\xa6\x96':u'\uf80b','\xa6\x97':u'\u262f\uf87a','\xa6\x98' +:u'\u262f\uf876','\xa6\x99':u'\u2740','\xa6\x9a':u'\uf80c','\xa6\x9b': +u'\u2748\u20d8','\xa6\x9e':u'\u3020','\xa6\x9f':u'\uf807','\xa6\xe5':u'\u2776', +'\xa6\xe6':u'\u2777','\xa6\xe7':u'\u2778','\xa6\xe8':u'\u2779','\xa6\xe9': +u'\u277a','\xa6\xea':u'\u277b','\xa6\xeb':u'\u277c','\xa6\xec':u'\u277d', +'\xa6\xed':u'\u277e','\xa6\xee':u'\u277f','\xa6\xef':u'\u24eb','\xa6\xf0': +u'\u24ec','\xa6\xf1':u'\u24ed','\xa6\xf2':u'\u24ee','\xa6\xf3':u'\u24ef', +'\xa6\xf4':u'\u24f0','\xa6\xf5':u'\u24f1','\xa6\xf6':u'\u24f2','\xa6\xf7': +u'\u24f3','\xa6\xf8':u'\u24f4','\xa6\xf9':u'\u3251\uf87a','\xa6\xfa': +u'\u3252\uf87a','\xa6\xfb':u'\u3253\uf87a','\xa6\xfc':u'\u3254\uf87a', +'\xa6\xfd':u'\u3255\uf87a','\xa6\xfe':u'\u3256\uf87a','\xa7':2,'\xa7A': +u'\u2642\uf87f','\xa7B':u'\u3012','\xa7C':u'\u3036','\xa7D':u'\u25cb\uf87f', +'\xa7E':u'\u25b3\uf87f','\xa7F':u'\u25fb','\xa7G':u'\uf84c','\xa7H': +u'\u2394\uf876','\xa7I':u'\u25ad\uf878','\xa7J':u'\u25ad','\xa7K':u'\uf84d', +'\xa7L':u'\uf84e','\xa7M':u'\uf84f','\xa7N':u'\u25c7\uf87f','\xa7O': +u'\u51f9\uf87f','\xa7P':u'\u51f8\uf87f','\xa7Q':u'\u2206','\xa7R': +u'\u2206\uf87f','\xa7S':u'\u221f','\xa7T':u'\u222a\uf87f','\xa7U':u'\u2225', +'\xa7V':u'\u2226','\xa7W':u'\u2229\uf87f','\xa7X':u'\u2253','\xa7Y':u'\u2251', +'\xa7Z':u'\u2266','\xa7[':u'\u2267','\xa7\\':u'\u2213','\xa7]':u'\u2295', +'\xa7^':u'\u2296','\xa7_':u'\u2297','\xa7`':u'\u2a38','\xa7a':u'\u2314','\xa7b' +:u'=\u20e5','\xa7c':u'\u2261\u20e5','\xa7d':u'\u2262','\xa7e':u'=\u20d2', +'\xa7f':u'\u25b1','\xa7g':u'-\u0308','\xa7h':u'\u2222','\xa7i':u'\u2250', +'\xa7j':u'\u03d5','\xa7k':u'\u2ae8','\xa7l':u'\u22a3','\xa7m':u'\u22a5\u0338', +'\xa7n':u'\u2261\u20d2','\xa7o':u'\u226e','\xa7p':u'\u226f','\xa7q':u'\u2285', +'\xa7r':u'\u2284','\xa7s':u'\u2209','\xa7t':u'\u220c','\xa7u':u'\u22bb','\xa7v' +:u'\u22bc','\xa7w':u'\u225a','\xa7x':u'\u2306','\xa7y':u'\u223d\u0336','\xa7z': +u'\u2314\uf87f','\xa7{':u'\u2a72','\xa7|':u'\u88dc\u20e4','\xa7}': +u'\uf862\uc8fc\uc2dd\ud68c\uc0ac','\xa7\x81':u'\uf863\uc8fc\uc2dd\ud68c\uc0ac', +'\xa7\x82':u'\u329e','\xa7\x83':u'\u329e\uf87f','\xa7\x84':u'\u203c','\xa7\x85' +:u'\u2049','\xa7\x86':u'\u203c\uf87f','\xa7\x87':u'\u2047','\xa7\x88': +u'\u25c7\uf87c','\xa7\x89':u'\u25c7\uf879','\xa7\x8a':u'\u25c7\uf87b', +'\xa7\x8b':u'\u25c6\uf879','\xa7\x8c':u'\u25a1\uf87c','\xa7\x8d': +u'\u25a1\uf879','\xa7\x8e':u'\u25a1\uf87b','\xa7\x8f':u'\u2588','\xa7\x90': +u'\u25e6','\xa7\x91':u'\u25cb\uf879','\xa7\x92':u'\u25cb\uf87b','\xa7\x93': +u'\u25cf\uf879','\xa7\x94':u'\u25bf','\xa7\x95':u'\u25b5','\xa7\x96':u'\u25b9', +'\xa7\x97':u'\u25c3','\xa7\x98':u'\u2666','\xa7\x99':u'\u2981','\xa7\x9a': +u'\u25fc','\xa7\x9b':u'\u25b4\u20e4','\xa7\x9c':u'\u25ca','\xa7\x9d':u'\u3231', +'\xa7\x9e':u'\u3239','\xa7\x9f':u'\u33cb','\xa7\xf0':u'\u246f','\xa7\xf1': +u'\u2470','\xa7\xf2':u'\u2471','\xa7\xf3':u'\u2472','\xa7\xf4':u'\u2473', +'\xa7\xf5':u'\u3251','\xa7\xf6':u'\u3252','\xa7\xf7':u'\u3253','\xa7\xf8': +u'\u3254','\xa7\xf9':u'\u3255','\xa7\xfa':u'\u3256','\xa7\xfb':u'\u3257', +'\xa7\xfc':u'\u3258','\xa7\xfd':u'\u3259','\xa7\xfe':u'\u325a','\xa8':2,'\xa8A' +:u'\u2192\uf87b','\xa8B':u'\u2190\uf87b','\xa8C':u'\u2191\uf87b','\xa8D': +u'\u2193\uf87b','\xa8E':u'\u2196\uf87b','\xa8F':u'\u2197\uf87b','\xa8G': +u'\u2198\uf87b','\xa8H':u'\u2199\uf87b','\xa8I':u'\u21d0','\xa8J':u'\u21cf', +'\xa8K':u'\u21cd','\xa8L':u'\u21d4\uf87f','\xa8M':u'\u2192\uf87c','\xa8N': +u'\u2190\uf87c','\xa8O':u'\u2191\uf87c','\xa8P':u'\u2193\uf87c','\xa8Q': +u'\u2194\uf87c','\xa8R':u'\u2195\uf87c','\xa8S':u'\u2190\uf879','\xa8T': +u'\u2192\uf879','\xa8U':u'\u2191\uf879','\xa8V':u'\u2193\uf879','\xa8W': +u'\u21e6\u20de','\xa8X':u'\u21e8\u20de','\xa8Y':u'\u21e7\u20de','\xa8Z': +u'\u21e9\u20de','\xa8[':u'\u21e6\u20dd','\xa8\\':u'\u27b2','\xa8]': +u'\u21e7\u20dd','\xa8^':u'\u21e9\u20dd','\xa8_':u'\u2190\uf87f','\xa8`': +u'\u279c','\xa8a':u'\u2191\uf87f','\xa8b':u'\u2193\uf87f','\xa8c': +u'\u2190\uf875','\xa8d':u'\u2192\uf875','\xa8e':u'\u2191\uf875','\xa8f': +u'\u2193\uf875','\xa8g':u'\uf846','\xa8h':u'\uf847','\xa8i':u'\u2190\uf871', +'\xa8j':u'\u279b','\xa8k':u'\u2190\uf872','\xa8l':u'\u2192\uf872','\xa8m': +u'\u2191\uf872','\xa8n':u'\u2193\uf872','\xa8o':u'\u2962','\xa8p':u'\u2964', +'\xa8q':u'\u2963','\xa8r':u'\u2965','\xa8s':u'\u21e6\uf87a','\xa8t':u'\u27a1', +'\xa8u':u'\u21e7\uf87a','\xa8v':u'\u21e9\uf87a','\xa8w':u'\u21e6\uf87b','\xa8x' +:u'\u279e','\xa8y':u'\u21e7\uf87b','\xa8z':u'\u21e9\uf87b','\xa8{':u'\u21b2', +'\xa8|':u'\u21b1','\xa8}':u'\u21bb\uf87b','\xa8\x81':u'\u21b4','\xa8\x82': +u'\u21b0','\xa8\x83':u'\u21b3','\xa8\x84':u'\u2939\uf87f','\xa8\x85': +u'\u2934\uf87f','\xa8\x86':u'\u2936','\xa8\x87':u'\u21b1\uf87f','\xa8\x88': +u'\u21bb\uf87f','\xa8\x89':u'\u2935','\xa8\x8a':u'\u21b0\uf87f','\xa8\x8b': +u'\u2937','\xa8\x8c':u'\u2939','\xa8\x8d':u'\u2934','\xa8\x8e':u'\u21e6\uf879', +'\xa8\x8f':u'\u21e8\uf879','\xa8\x90':u'\u21e7\uf879','\xa8\x91': +u'\u21e9\uf879','\xa8\x92':u'\u21bc','\xa8\x93':u'\u21c0','\xa8\x94':u'\uf841', +'\xa8\x95':u'\u21d4\uf879','\xa8\x96':u'\u21e8\uf874','\xa8\x97': +u'\u21e6\uf874','\xa8\x98':u'\u21c0\uf879','\xa8\x99':u'\u21bc\uf879', +'\xa8\x9a':u'\u21d2\uf87c','\xa8\x9b':u'\u21d0\uf87c','\xa8\x9c':u'\uf849', +'\xa8\x9d':u'\uf848','\xa8\x9e':u'\u21c4','\xa8\x9f':u'\u21c5','\xa9':2,'\xa9A' +:u'\uf860A.','\xa9B':u'\uf860B.','\xa9C':u'\uf860C.','\xa9D':u'\uf860D.', +'\xa9E':u'\uf860E.','\xa9F':u'\uf860F.','\xa9G':u'\uf860G.','\xa9H':u'\uf860H.' +,'\xa9I':u'\uf860I.','\xa9J':u'\uf860J.','\xa9K':u'\uf860K.','\xa9L': +u'\uf860L.','\xa9M':u'\uf860M.','\xa9N':u'\uf860N.','\xa9O':u'\uf860O.','\xa9P' +:u'\uf860P.','\xa9Q':u'\uf860Q.','\xa9R':u'\uf860R.','\xa9S':u'\uf860S.', +'\xa9T':u'\uf860T.','\xa9U':u'\uf860U.','\xa9V':u'\uf860V.','\xa9W':u'\uf860W.' +,'\xa9X':u'\uf860X.','\xa9Y':u'\uf860Y.','\xa9Z':u'\uf860Z.','\xa9[': +u'\uf860a.','\xa9\\':u'\uf860b.','\xa9]':u'\uf860c.','\xa9^':u'\uf860d.', +'\xa9_':u'\uf860e.','\xa9`':u'\uf860f.','\xa9a':u'\uf860g.','\xa9b':u'\uf860h.' +,'\xa9c':u'\uf860i.','\xa9d':u'\uf860j.','\xa9e':u'\uf860k.','\xa9f': +u'\uf860l.','\xa9g':u'\uf860m.','\xa9h':u'\uf860n.','\xa9i':u'\uf860o.','\xa9j' +:u'\uf860p.','\xa9k':u'\uf860q.','\xa9l':u'\uf860r.','\xa9m':u'\uf860s.', +'\xa9n':u'\uf860t.','\xa9o':u'\uf860u.','\xa9p':u'\uf860v.','\xa9q':u'\uf860w.' +,'\xa9r':u'\uf860x.','\xa9s':u'\uf860y.','\xa9t':u'\uf860z.','\xaa':2,'\xaaA': +u'\uc6b4\u20de','\xaaB':u'\ub2f5\u20de','\xaaC':u'\uc8fc\u20de','\xaaD': +u'\uba85\u20de','\xaaE':u'\ub300\u20de','\xaaF':u'\ud615\u20de','\xaaG': +u'\ubd80\u20de','\xaaH':u'\uc804\u20de','\xaaI':u'\uc811\u20de','\xaaJ': +u'\uc218\u20de','\xaaK':u'\ub3d9\u20de','\xaaL':u'\ube44\u20de','\xaaM': +u'\ubc18\u20de','\xaaN':u'\uc790\u20de','\xaaO':u'\ud0c0\u20de','\xaaP': +u'\uac10\u20de','\xaaQ':u'\uc57d\u20de','\xaaR':u'\uc778\u20de','\xaaS': +u'\ub73b\u20de','\xaaT':u'\u5370\u20de','\xaaU':u'\u8a3b\u20de','\xaaV': +u'\uc608\u20de','\xaaW':u'\u611f\u20de','\xaaX':u'\u51a0\u20de','\xaaY': +u'\u7b54\u20de','\xaaZ':u'\u4ee3\u20de','\xaa[':u'\u982d\u20de','\xaa\\': +u'\u52d5\u20de','\xaa]':u'\u540d\u20de','\xaa^':u'\u76ee\u20de','\xaa_': +u'\u53cd\u20de','\xaa`':u'\u88dc\u20de','\xaaa':u'\u672c\u20de','\xaab': +u'\u526f\u20de','\xaac':u'\u5e8f\u20de','\xaad':u'\u9023\u20de','\xaae': +u'\u5f71\u20de','\xaaf':u'\u4f8b\u20de','\xaag':u'\u6e90\u20de','\xaah': +u'\u5b50\u20de','\xaai':u'\u524d\u20de','\xaaj':u'\u7bc0\u20de','\xaak': +u'\u63a5\u20de','\xaal':u'\u52a9\u20de','\xaam':u'\u6307\u20de','\xaan': +u'\u4ed6\u20de','\xaao':u'\u6d3e\u20de','\xaap':u'\u5f62\u20de','\xaaq': +u'\uc870\u20de','\xaar':u'\ubb38\u20de\uf87a','\xaas':u'\ub2f5\u20de\uf87a', +'\xaat':u'\uc8fc\u20de\uf87a','\xaau':u'\ub73b\u20de\uf87a','\xaav': +u'\u8a3b\u20de\uf87a','\xaaw':u'\uad50\u20de\uf87a','\xaax': +u'\uc5ed\u20de\uf87a','\xaay':u'\uc74c\u20de\uf87a','\xaaz': +u'\uc815\u20de\uf87a','\xaa{':u'\ud574\u20de\uf87a','\xaa|': +u'\uc608\u20de\uf87a','\xaa}':u'\uc874\u20dd','\xaa\x81':u'\ub77c\u20dd', +'\xaa\x82':u'\ub9c8\u20dd','\xaa\x83':u'\ubc14\u20dd','\xaa\x84': +u'\uc0ac\u20dd','\xaa\x85':u'\uc544\u20dd','\xaa\x86':u'\uc790\u20dd', +'\xaa\x87':u'\ucc28\u20dd','\xaa\x88':u'\uce74\u20dd','\xaa\x89': +u'\ud0c0\u20dd','\xaa\x8a':u'\ud30c\u20dd','\xaa\x8b':u'\ub192\u20dd', +'\xaa\x8c':u'\ub0ae\u20dd','\xaa\x8d':u'\uba85\u20dd','\xaa\x8e': +u'\ub300\u20dd','\xaa\x8f':u'\ud615\u20dd','\xaa\x90':u'\ubd80\u20dd', +'\xaa\x91':u'\uc804\u20dd','\xaa\x92':u'\uc811\u20dd','\xaa\x93': +u'\uc218\u20dd','\xaa\x94':u'\ub3d9\u20dd','\xaa\x95':u'\ube44\u20dd', +'\xaa\x96':u'\uac8c\u20dd','\xaa\x97':u'\ubc18\u20dd','\xaa\x98': +u'\uc18d\u20dd','\xaa\x99':u'\uc778\u20dd','\xaa\x9a':u'\ubcf8\u20dd', +'\xaa\x9b':u'\uc57d\u20dd','\xaa\x9c':u'\uc219\u20dd','\xaa\x9d': +u'\uc720\u20dd','\xaa\x9e':u'\uad00\u20dd','\xaa\x9f':u'\u51a0\u20dd', +'\xaa\xf4':u'\u2483','\xaa\xf5':u'\u2484','\xaa\xf6':u'\u2485','\xaa\xf7': +u'\u2486','\xaa\xf8':u'\u2487','\xaa\xf9':u'\uf862(21)','\xaa\xfa': +u'\uf862(22)','\xaa\xfb':u'\uf862(23)','\xaa\xfc':u'\uf862(24)','\xaa\xfd': +u'\uf862(25)','\xaa\xfe':u'\uf862(26)','\xab':2,'\xabA':u'\uc870\u20dd','\xabB' +:u'\uad6d\u20dd','\xabC':u'\uac10\u20dd','\xabD':u'\u5370\u20dd','\xabE': +u'\u8863\u20dd','\xabF':u'\u672b\u20dd','\xabG':u'\uac70\u20dd','\xabH': +u'\ub2f5\u20dd','\xabI':u'\ubcc0\u20dd','\xabJ':u'\uc0c1\u20dd','\xabK': +u'\uc13c\u20dd','\xabL':u'\uc2e0\u20dd','\xabM':u'\uc5ec\u20dd','\xabN': +u'\uc608\u20dd','\xabO':u'\uc6d0\u20dd','\xabP':u'\uc791\u20dd','\xabQ': +u'\uc900\u20dd','\xabR':u'\ud0b9\u20dd','\xabS':u'\uc678\u20dd','\xabT': +u'\ud65c\u20dd','\xabU':u'\uac04\u20dd','\xabV':u'\uac19\u20dd','\xabW': +u'\uc2e4\u20dd','\xabX':u'\u611f\u20dd','\xabY':u'\u6163\u20dd','\xabZ': +u'\u4ee3\u20dd','\xab[':u'\u52d5\u20dd','\xab\\':u'\u3294','\xab]': +u'\u53cd\u20dd','\xab^':u'\u526f\u20dd','\xab_':u'\u81ea\u20dd','\xab`': +u'\u524d\u20dd','\xaba':u'\u96fb\u20dd','\xabb':u'\u63a5\u20dd','\xabc': +u'\u52a9\u20dd','\xabd':u'\u6ce8\u20dd','\xabe':u'\u53c3\u20dd','\xabf': +u'\u672c\u20dd','\xabg':u'\u65b0\u20dd','\xabh':u'\u73fe\u20dd','\xabi': +u'\u5f62\u20dd','\xabj':u'\u9593\u20dd','\xabk':u'\u570b\u20dd','\xabl': +u'\u32a5','\xabm':u'\u4ed6\u20dd','\xabn':u'\ube60\u20dd','\xabo': +u'\uc2dc\u20dd','\xabp':u'\uc785\u20dd','\xabq':u'\uc73c\u20dd','\xabr': +u'\uc74c\u20dd','\xabs':u'\uc9c1\u20dd','\xabt':u'\ud45c\u20dd','\xabu': +u'\uac00\u20dd','\xabv':u'\ub098\u20dd','\xabw':u'\ub2e4\u20dd','\xabx': +u'\ud558\u20dd','\xaby':u'\ub9c8\u20dd\uf87a','\xabz':u'\ubc14\u20dd\uf87a', +'\xab{':u'\uc0ac\u20dd\uf87a','\xab|':u'\uc544\u20dd\uf87a','\xab}': +u'\uc790\u20dd\uf87a','\xab\x81':u'\ucc28\u20dd\uf87a','\xab\x82': +u'\uce74\u20dd\uf87a','\xab\x83':u'\ud0c0\u20dd\uf87a','\xab\x84': +u'\ud30c\u20dd\uf87a','\xab\x85':u'\ud558\u20dd\uf87a','\xab\x86': +u'\ube44\u20dd\uf87a','\xab\x87':u'\ub2f5\u20dd\uf87a','\xab\x88': +u'\ube60\u20dd\uf87a','\xab\x89':u'\ubcf8\u20dd\uf87a','\xab\x8a': +u'\ub2e8\u20dd\uf87a','\xab\x8b':u'\uc13c\u20dd\uf87a','\xab\x8c': +u'\uc2dc\u20dd\uf87a','\xab\x8d':u'\uc5ec\u20dd\uf87a','\xab\x8e': +u'\uc608\u20dd\uf87a','\xab\x8f':u'\uc73c\u20dd\uf87a','\xab\x90': +u'\uc74c\u20dd\uf87a','\xab\x91':u'\uc785\u20dd\uf87a','\xab\x92': +u'\uc81c\u20dd\uf87a','\xab\x93':u'\uc874\u20dd\uf87a','\xab\x94': +u'\uc900\u20dd\uf87a','\xab\x95':u'\ud45c\u20dd\uf87a','\xab\x96': +u'\ud574\u20dd\uf87a','\xab\x97':u'\ub290\u20dd\uf87a','\xab\x98': +u'\ub192\u20dd\uf87a','\xab\x99':u'\ub0ae\u20dd\uf87a','\xab\x9a': +u'\ubc18\u20dd\uf87a','\xab\x9b':u'\uac00\u20dd\uf87a','\xab\x9c': +u'\ub098\u20dd\uf87a','\xab\x9d':u'\ub2e4\u20dd\uf87a','\xab\x9e': +u'\ub77c\u20dd\uf87a','\xab\x9f':u'\uc678\u20dd\uf87a','\xab\xf7':u'\uf862(27)' +,'\xab\xf8':u'\uf862(28)','\xab\xf9':u'\uf862(29)','\xab\xfa':u'\uf862(30)', +'\xac':2,'\xacA':u'\u21f0','\xacB':u'\uf843','\xacC':u'\u27b5','\xacD': +u'\u2964\uf87f','\xacE':u'\u2962\uf87f','\xacF':u'\u21e8\uf870','\xacG': +u'\u21e6\uf870','\xacH':u'\u27a4','\xacI':u'\uf844','\xacJ':u'\uf84b','\xacK': +u'\uf84a','\xacL':u'\u21c0\uf87f','\xacM':u'\u21bc\uf87f','\xacN': +u'\u21e8\uf87f','\xacO':u'\u21e6\uf87f','\xacP':u'\u21b6','\xacQ':u'\u21b7', +'\xacR':u'\u219d','\xacS':u'\u219c','\xacT':u'\uf842','\xacU':u'\u2190\uf87a', +'\xacV':u'\u2192\uf87a','\xacW':u'\u2191\uf87a','\xacX':u'\u2193\uf87a','\xacY' +:u'\u21e6\uf87c','\xacZ':u'\u21e8\uf87c','\xac[':u'\u21e7\uf87c','\xac\\': +u'\u21e9\uf87c','\xac]':u'\u2190\uf873','\xac^':u'\u2794','\xac_':u'\uf845', +'\xac`':u'\u2191\uf873','\xaca':u'\u2193\uf873','\xacb':u'\u2190\uf878','\xacc' +:u'\u2192\uf878','\xacd':u'\u2191\uf878','\xace':u'\u2193\uf878','\xacf': +u'\u2190\uf874','\xacg':u'\u2192\uf874','\xach':u'\u2191\uf874','\xaci': +u'\u2193\uf874','\xacj':u'\u21e0','\xack':u'\u21e2','\xacl':u'\u21e1','\xacm': +u'\u21e3','\xacn':u'\u21e6\uf875','\xaco':u'\u21e8\uf875','\xacp': +u'\u21e7\uf875','\xacq':u'\u21e9\uf875','\xacr':u'\u21e6','\xacs':u'\u21e8', +'\xact':u'\u21e7','\xacu':u'\u21e9','\xacv':u'\u2936\uf87a','\xacw': +u'\u21b1\uf87a','\xacx':u'\u21bb\uf87a','\xacy':u'\u2935\uf87a','\xacz': +u'\u21b0\uf87a','\xac{':u'\u2937\uf87a','\xac|':u'\u2939\uf87a','\xac}': +u'\u2934\uf87a','\xac\x81':u'\u2936\uf87c','\xac\x82':u'\u21b1\uf87c', +'\xac\x83':u'\u21bb\uf87c','\xac\x84':u'\u2935\uf87c','\xac\x85': +u'\u21b0\uf87c','\xac\x86':u'\u2937\uf87c','\xac\x87':u'\u2939\uf87c', +'\xac\x88':u'\u2934\uf87c','\xac\x89':u'\u2190\uf870','\xac\x8a': +u'\u2192\uf870','\xac\x8b':u'\u2191\uf870','\xac\x8c':u'\u2193\uf870', +'\xac\x8d':u'\u261d','\xac\x8e':u'\u261f','\xac\x8f':u'\u261d\uf87f','\xac\x90' +:u'\u261f\uf87f','\xac\x91':u'\ub2e8\u20dd','\xac\x92':u'\ucc38\u20dd', +'\xac\x93':u'\uc18c\u20dd','\xac\x94':u'\uc911\u20dd','\xac\x95': +u'\uc77c\u20dd','\xac\x96':u'\uc774\u20dd','\xac\x97':u'\ud734\u20dd', +'\xac\xc2':u'1\u20de\uf875','\xac\xc3':u'2\u20de\uf875','\xac\xc4': +u'3\u20de\uf875','\xac\xc5':u'4\u20de\uf875','\xac\xc6':u'5\u20de\uf875', +'\xac\xc7':u'6\u20de\uf875','\xac\xc8':u'7\u20de\uf875','\xac\xc9': +u'8\u20de\uf875','\xac\xca':u'9\u20de\uf875','\xac\xcb':u'\uf866[10]', +'\xac\xcc':u'\uf866[11]','\xac\xcd':u'\uf866[12]','\xac\xce':u'\uf866[13]', +'\xac\xcf':u'\uf866[14]','\xac\xd0':u'\uf866[15]','\xac\xf2':u'\uf866[16]', +'\xac\xf3':u'\uf866[17]','\xac\xf4':u'\uf866[18]','\xac\xf5':u'\uf866[19]', +'\xac\xf6':u'\uf866[20]','\xad':2,'\xadA':u'\u4e00\u20de\uf87a','\xadB': +u'\u4e8c\u20de\uf87a','\xadC':u'\u4e09\u20de\uf87a','\xadD': +u'\u56db\u20de\uf87a','\xadE':u'\u4e94\u20de\uf87a','\xadF': +u'\u516d\u20de\uf87a','\xadG':u'\u4e03\u20de\uf87a','\xadH': +u'\u516b\u20de\uf87a','\xadI':u'\u4e5d\u20de\uf87a','\xadJ': +u'\u5341\u20de\uf87a','\xadK':u'\uf863[\u5341\u4e00]','\xadL': +u'\uf863[\u5341\u4e8c]','\xadM':u'\uf863[\u5341\u4e09]','\xadN': +u'\uf863[\u5341\u56db]','\xadO':u'\uf863[\u5341\u4e94]','\xadP': +u'\uf863[\u5341\u516d]','\xadQ':u'\uf863[\u5341\u4e03]','\xadR': +u'\uf863[\u5341\u516b]','\xadS':u'\uf863[\u5341\u4e5d]','\xadT': +u'\uf863[\u4e8c\u5341]','\xadU':u'\u4e00\u20de','\xadV':u'\u4e8c\u20de','\xadW' +:u'\u4e09\u20de','\xadX':u'\u56db\u20de','\xadY':u'\u4e94\u20de','\xadZ': +u'\u516d\u20de','\xad[':u'\u4e03\u20de','\xad\\':u'\u516b\u20de','\xad]': +u'\u4e5d\u20de','\xad^':u'\u5341\u20de','\xad_':u'\uf862[\u5341\u4e00]','\xad`' +:u'\uf862[\u5341\u4e8c]','\xada':u'\uf862[\u5341\u4e09]','\xadb': +u'\uf862[\u5341\u56db]','\xadc':u'\uf862[\u5341\u4e94]','\xadd': +u'\uf862[\u5341\u516d]','\xade':u'\uf862[\u5341\u4e03]','\xadf': +u'\uf862[\u5341\u516b]','\xadg':u'\uf862[\u5341\u4e5d]','\xadh': +u'\uf862[\u4e8c\u5341]','\xadi':u'\u65e5\u20de','\xadj':u'\u6708\u20de','\xadk' +:u'\u706b\u20de','\xadl':u'\u6c34\u20de','\xadm':u'\u6728\u20de','\xadn': +u'\u91d1\u20de','\xado':u'\u571f\u20de','\xadp':u'\u3290','\xadq':u'\u328a', +'\xadr':u'\u328b','\xads':u'\u328c','\xadt':u'\u328d','\xadu':u'\u328e','\xadv' +:u'\u328f','\xadw':u'\u65e5\u20de\uf87c','\xadx':u'\u6708\u20de\uf87c','\xady': +u'\u706b\u20de\uf87c','\xadz':u'\u6c34\u20de\uf87c','\xad{': +u'\u6728\u20de\uf87c','\xad|':u'\u91d1\u20de\uf87c','\xad}': +u'\u571f\u20de\uf87c','\xad\xa1':u'\u300c\uf879','\xad\xa2':u'\u300d\uf879', +'\xad\xa3':u'\u300e\uf879','\xad\xa4':u'\u300f\uf879','\xad\xa5': +u'\u21e8\uf878','\xad\xa6':u'\u21e6\uf878','\xad\xa7':u'\u21e7\uf878', +'\xad\xa8':u'\u21e9\uf878','\xad\xa9':u'\u301e','\xad\xaa':u'\u301f','\xad\xab' +:u'\u2036','\xad\xac':u'\u2033\uf873','\xad\xad':u'\u2035','\xad\xae': +u'\u2032\uf873','\xad\xaf':u'\u21e7\uf87f','\xad\xb0':u'!\uf87f','\xff': +u'\u2026\uf87f' +} + +basecodec = _codecs_kr.getcodec('euc_kr') +codec = mbc.create_extcodec('mac_korean', basecodec, encode_map, decode_map, + 5, 2, 1) + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='mac_korean', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) Index: Lib/encodings/mac_chintrad.py =================================================================== --- Lib/encodings/mac_chintrad.py (revision 0) +++ Lib/encodings/mac_chintrad.py (revision 0) @@ -0,0 +1,190 @@ +# +# mac_chintrad.py: Python Unicode Codec for MAC_CHINTRAD +# +# Written by Hye-Shik Chang +# + +import _codecs_tw, codecs +import _multibytecodec as mbc + +encode_map = { +u'\\':(2,'\\'),u'\\\uf87f':'\x80',u'\x83':'\x83',u'\x84':'\x84',u'\x85':'\x85', +u'\x86':'\x86',u'\x87':'\x87',u'\x88':'\x88',u'\x89':'\x89',u'\x8a':'\x8a', +u'\x8b':'\x8b',u'\x8c':'\x8c',u'\x8d':'\x8d',u'\x8e':'\x8e',u'\x8f':'\x8f', +u'\x90':'\x90',u'\x91':'\x91',u'\x92':'\x92',u'\x93':'\x93',u'\x94':'\x94', +u'\x95':'\x95',u'\x96':'\x96',u'\x97':'\x97',u'\x98':'\x98',u'\x99':'\x99', +u'\x9a':'\x9a',u'\x9b':'\x9b',u'\x9c':'\x9c',u'\x9d':'\x9d',u'\x9e':'\x9e', +u'\x9f':'\x9f',u'\xa0':'\xa0',u'\xa9':'\xfd',u'\xb7':'\xa1E',u'\u0401':None, +u'\u0414':None,u'\u0415':None,u'\u0416':None,u'\u0417':None,u'\u0418':None, +u'\u0419':None,u'\u041a':None,u'\u041b':None,u'\u041c':None,u'\u0423':None, +u'\u0424':None,u'\u0425':None,u'\u0426':None,u'\u0427':None,u'\u0428':None, +u'\u0429':None,u'\u042a':None,u'\u042b':None,u'\u042c':None,u'\u042d':None, +u'\u042e':None,u'\u042f':None,u'\u0430':None,u'\u0431':None,u'\u0432':None, +u'\u0433':None,u'\u0434':None,u'\u0435':None,u'\u0436':None,u'\u0437':None, +u'\u0438':None,u'\u0439':None,u'\u043a':None,u'\u043b':None,u'\u043c':None, +u'\u043d':None,u'\u043e':None,u'\u043f':None,u'\u0440':None,u'\u0441':None, +u'\u0442':None,u'\u0443':None,u'\u0444':None,u'\u0445':None,u'\u0446':None, +u'\u0447':None,u'\u0448':None,u'\u0449':None,u'\u044a':None,u'\u044b':None, +u'\u044c':None,u'\u044d':None,u'\u044e':None,u'\u044f':None,u'\u0451':None, +u'\u2022':None,u'\u2026':'\xff',u'\u203e':(2,'\xa1\xc2'),u'\u203e\uf87c': +'\xa1\xc3',u'\u2122':'\xfe',u'\u2295':'\xa1\xf2',u'\u22ef':'\xa1K',u'\u2460': +None,u'\u2461':None,u'\u2462':None,u'\u2463':None,u'\u2464':None,u'\u2465':None +,u'\u2466':None,u'\u2467':None,u'\u2468':None,u'\u2469':None,u'\u2474':None, +u'\u2475':None,u'\u2476':None,u'\u2477':None,u'\u2478':None,u'\u2479':None, +u'\u247a':None,u'\u247b':None,u'\u247c':None,u'\u247d':None,u'\u2502': +(2,'\xa2x'),u'\u2502\uf87f':'\xa2y',u'\u2595':None,u'\u2641':None,u'\u3001': +(2,'\xa1B'),u'\u3001\uf87d':'\xa1N',u'\u3005':None,u'\u3014':(2,'\xa1e'), +u'\u3014\uf87f':'\xa1\xa3',u'\u3015':(2,'\xa1f'),u'\u3015\uf87f':'\xa1\xa4', +u'\u3041':None,u'\u3042':None,u'\u3043':None,u'\u3044':None,u'\u3045':None, +u'\u3046':None,u'\u3047':None,u'\u3048':None,u'\u3049':None,u'\u304a':None, +u'\u304b':None,u'\u304c':None,u'\u304d':None,u'\u304e':None,u'\u304f':None, +u'\u3050':None,u'\u3051':None,u'\u3052':None,u'\u3053':None,u'\u3054':None, +u'\u3055':None,u'\u3056':None,u'\u3057':None,u'\u3058':None,u'\u3059':None, +u'\u305a':None,u'\u305b':None,u'\u305c':None,u'\u305d':None,u'\u305e':None, +u'\u305f':None,u'\u3060':None,u'\u3061':None,u'\u3062':None,u'\u3063':None, +u'\u3064':None,u'\u3065':None,u'\u3066':None,u'\u3067':None,u'\u3068':None, +u'\u3069':None,u'\u306a':None,u'\u306b':None,u'\u306c':None,u'\u306d':None, +u'\u306e':None,u'\u306f':None,u'\u3070':None,u'\u3071':None,u'\u3072':None, +u'\u3073':None,u'\u3074':None,u'\u3075':None,u'\u3076':None,u'\u3077':None, +u'\u3078':None,u'\u3079':None,u'\u307a':None,u'\u307b':None,u'\u307c':None, +u'\u307d':None,u'\u307e':None,u'\u307f':None,u'\u3080':None,u'\u3081':None, +u'\u3082':None,u'\u3083':None,u'\u3084':None,u'\u3085':None,u'\u3086':None, +u'\u3087':None,u'\u3088':None,u'\u3089':None,u'\u308a':None,u'\u308b':None, +u'\u308c':None,u'\u308d':None,u'\u308e':None,u'\u308f':None,u'\u3090':None, +u'\u3091':None,u'\u3092':None,u'\u3093':None,u'\u309d':None,u'\u309e':None, +u'\u30a1':None,u'\u30a2':None,u'\u30a3':None,u'\u30a4':None,u'\u30a5':None, +u'\u30a6':None,u'\u30a7':None,u'\u30a8':None,u'\u30a9':None,u'\u30aa':None, +u'\u30ab':None,u'\u30ac':None,u'\u30ad':None,u'\u30ae':None,u'\u30af':None, +u'\u30b0':None,u'\u30b1':None,u'\u30b2':None,u'\u30b3':None,u'\u30b4':None, +u'\u30b5':None,u'\u30b6':None,u'\u30b7':None,u'\u30b8':None,u'\u30b9':None, +u'\u30ba':None,u'\u30bb':None,u'\u30bc':None,u'\u30bd':None,u'\u30be':None, +u'\u30bf':None,u'\u30c0':None,u'\u30c1':None,u'\u30c2':None,u'\u30c3':None, +u'\u30c4':None,u'\u30c5':None,u'\u30c6':None,u'\u30c7':None,u'\u30c8':None, +u'\u30c9':None,u'\u30ca':None,u'\u30cb':None,u'\u30cc':None,u'\u30cd':None, +u'\u30ce':None,u'\u30cf':None,u'\u30d0':None,u'\u30d1':None,u'\u30d2':None, +u'\u30d3':None,u'\u30d4':None,u'\u30d5':None,u'\u30d6':None,u'\u30d7':None, +u'\u30d8':None,u'\u30d9':None,u'\u30da':None,u'\u30db':None,u'\u30dc':None, +u'\u30dd':None,u'\u30de':None,u'\u30df':None,u'\u30e0':None,u'\u30e1':None, +u'\u30e2':None,u'\u30e3':None,u'\u30e4':None,u'\u30e5':None,u'\u30e6':None, +u'\u30e7':None,u'\u30e8':None,u'\u30e9':None,u'\u30ea':None,u'\u30eb':None, +u'\u30ec':None,u'\u30ed':None,u'\u30ee':None,u'\u30ef':None,u'\u30f0':None, +u'\u30f1':None,u'\u30f2':None,u'\u30f3':None,u'\u30f4':None,u'\u30f5':None, +u'\u30f6':None,u'\u30fe':None,u'\u5341':(2,'\xa4Q'),u'\u5341\uf87f':'\xa2\xcc', +u'\u5345':(2,'\xa4\xca'),u'\u5345\uf87f':'\xa2\xce',u'\uf880':'\x81',u'\uf881': +'\x82',u'\ufe4b':(2,'\xa1\xca'),u'\ufe4b\uf87c':'\xa1\xcb',u'\ufe4c':None, +u'\ufe50':None,u'\ufe52':None,u'\ufe54':None,u'\ufe55':None,u'\ufe56':None, +u'\ufe57':None,u'\ufe59':None,u'\ufe5a':None,u'\ufe5b':None,u'\ufe5c':None, +u'\ufe5d':None,u'\ufe5e':None,u'\uff01':(2,'\xa1I'),u'\uff01\uf87d':'\xa1T', +u'\uff08':(2,'\xa1]'),u'\uff08\uf87f':'\xa1}',u'\uff09':(2,'\xa1^'), +u'\uff09\uf87f':'\xa1~',u'\uff0c':(2,'\xa1A'),u'\uff0c\uf87d':'\xa1M',u'\uff0e' +:(2,'\xa1D'),u'\uff0e\uf87d':'\xa1O',u'\uff0e\uf87e':'\xa1P',u'\uff0f': +(2,'\xa2A'),u'\uff0f\uf87f':'\xa1\xfe',u'\uff1a':(2,'\xa1G'),u'\uff1a\uf87d': +'\xa1R',u'\uff1b':(2,'\xa1F'),u'\uff1b\uf87d':'\xa1Q',u'\uff1f':(2,'\xa1H'), +u'\uff1f\uf87d':'\xa1S',u'\uff3c':(2,'\xa2B'),u'\uff3c\uf87f':'\xa2@',u'\uff3f' +:(2,'\xa1\xc4'),u'\uff3f\uf87c':'\xa1\xc5',u'\uff3f\uf87f':'\xa1Z',u'\uff5b': +(2,'\xa1a'),u'\uff5b\uf87f':'\xa1\xa1',u'\uff5d':(2,'\xa1b'),u'\uff5d\uf87f': +'\xa1\xa2',u'\uff64':None,u'\ufffd':None +} + +decode_map = { +'\x80':u'\\\uf87f','\x81':u'\uf880','\x82':u'\uf881','\x83':u'\x83','\x84': +u'\x84','\x85':u'\x85','\x86':u'\x86','\x87':u'\x87','\x88':u'\x88','\x89': +u'\x89','\x8a':u'\x8a','\x8b':u'\x8b','\x8c':u'\x8c','\x8d':u'\x8d','\x8e': +u'\x8e','\x8f':u'\x8f','\x90':u'\x90','\x91':u'\x91','\x92':u'\x92','\x93': +u'\x93','\x94':u'\x94','\x95':u'\x95','\x96':u'\x96','\x97':u'\x97','\x98': +u'\x98','\x99':u'\x99','\x9a':u'\x9a','\x9b':u'\x9b','\x9c':u'\x9c','\x9d': +u'\x9d','\x9e':u'\x9e','\x9f':u'\x9f','\xa0':u'\xa0','\xa1':2,'\xa1E':u'\xb7', +'\xa1K':u'\u22ef','\xa1M':u'\uff0c\uf87d','\xa1N':u'\u3001\uf87d','\xa1O': +u'\uff0e\uf87d','\xa1P':u'\uff0e\uf87e','\xa1Q':u'\uff1b\uf87d','\xa1R': +u'\uff1a\uf87d','\xa1S':u'\uff1f\uf87d','\xa1T':u'\uff01\uf87d','\xa1Z': +u'\uff3f\uf87f','\xa1}':u'\uff08\uf87f','\xa1~':u'\uff09\uf87f','\xa1\xa1': +u'\uff5b\uf87f','\xa1\xa2':u'\uff5d\uf87f','\xa1\xa3':u'\u3014\uf87f', +'\xa1\xa4':u'\u3015\uf87f','\xa1\xc3':u'\u203e\uf87c','\xa1\xc5': +u'\uff3f\uf87c','\xa1\xcb':u'\ufe4b\uf87c','\xa1\xf2':u'\u2295','\xa1\xfe': +u'\uff0f\uf87f','\xa2':2,'\xa2@':u'\uff3c\uf87f','\xa2y':u'\u2502\uf87f', +'\xa2\xcc':u'\u5341\uf87f','\xa2\xce':u'\u5345\uf87f','\xc6':2,'\xc6\xa1':None, +'\xc6\xa2':None,'\xc6\xa3':None,'\xc6\xa4':None,'\xc6\xa5':None,'\xc6\xa6':None +,'\xc6\xa7':None,'\xc6\xa8':None,'\xc6\xa9':None,'\xc6\xaa':None,'\xc6\xab': +None,'\xc6\xac':None,'\xc6\xad':None,'\xc6\xae':None,'\xc6\xaf':None,'\xc6\xb0' +:None,'\xc6\xb1':None,'\xc6\xb2':None,'\xc6\xb3':None,'\xc6\xb4':None, +'\xc6\xb5':None,'\xc6\xb6':None,'\xc6\xb7':None,'\xc6\xb8':None,'\xc6\xb9':None +,'\xc6\xba':None,'\xc6\xbb':None,'\xc6\xbc':None,'\xc6\xbd':None,'\xc6\xbe': +None,'\xc6\xbf':None,'\xc6\xc0':None,'\xc6\xc1':None,'\xc6\xc2':None,'\xc6\xc3' +:None,'\xc6\xc4':None,'\xc6\xc5':None,'\xc6\xc6':None,'\xc6\xc7':None, +'\xc6\xc8':None,'\xc6\xc9':None,'\xc6\xca':None,'\xc6\xcb':None,'\xc6\xcc':None +,'\xc6\xcd':None,'\xc6\xce':None,'\xc6\xcf':None,'\xc6\xd0':None,'\xc6\xd1': +None,'\xc6\xd2':None,'\xc6\xd3':None,'\xc6\xd4':None,'\xc6\xd5':None,'\xc6\xd6' +:None,'\xc6\xd7':None,'\xc6\xd8':None,'\xc6\xd9':None,'\xc6\xda':None, +'\xc6\xdb':None,'\xc6\xdc':None,'\xc6\xdd':None,'\xc6\xde':None,'\xc6\xdf':None +,'\xc6\xe0':None,'\xc6\xe1':None,'\xc6\xe2':None,'\xc6\xe3':None,'\xc6\xe4': +None,'\xc6\xe5':None,'\xc6\xe6':None,'\xc6\xe7':None,'\xc6\xe8':None,'\xc6\xe9' +:None,'\xc6\xea':None,'\xc6\xeb':None,'\xc6\xec':None,'\xc6\xed':None, +'\xc6\xee':None,'\xc6\xef':None,'\xc6\xf0':None,'\xc6\xf1':None,'\xc6\xf2':None +,'\xc6\xf3':None,'\xc6\xf4':None,'\xc6\xf5':None,'\xc6\xf6':None,'\xc6\xf7': +None,'\xc6\xf8':None,'\xc6\xf9':None,'\xc6\xfa':None,'\xc6\xfb':None,'\xc6\xfc' +:None,'\xc6\xfd':None,'\xc6\xfe':None,'\xc7':2,'\xc7@':None,'\xc7A':None, +'\xc7B':None,'\xc7C':None,'\xc7D':None,'\xc7E':None,'\xc7F':None,'\xc7G':None, +'\xc7H':None,'\xc7I':None,'\xc7J':None,'\xc7K':None,'\xc7L':None,'\xc7M':None, +'\xc7N':None,'\xc7O':None,'\xc7P':None,'\xc7Q':None,'\xc7R':None,'\xc7S':None, +'\xc7T':None,'\xc7U':None,'\xc7V':None,'\xc7W':None,'\xc7X':None,'\xc7Y':None, +'\xc7Z':None,'\xc7[':None,'\xc7\\':None,'\xc7]':None,'\xc7^':None,'\xc7_':None, +'\xc7`':None,'\xc7a':None,'\xc7b':None,'\xc7c':None,'\xc7d':None,'\xc7e':None, +'\xc7f':None,'\xc7g':None,'\xc7h':None,'\xc7i':None,'\xc7j':None,'\xc7k':None, +'\xc7l':None,'\xc7m':None,'\xc7n':None,'\xc7o':None,'\xc7p':None,'\xc7q':None, +'\xc7r':None,'\xc7s':None,'\xc7t':None,'\xc7u':None,'\xc7v':None,'\xc7w':None, +'\xc7x':None,'\xc7y':None,'\xc7z':None,'\xc7{':None,'\xc7|':None,'\xc7}':None, +'\xc7~':None,'\xc7\xa1':None,'\xc7\xa2':None,'\xc7\xa3':None,'\xc7\xa4':None, +'\xc7\xa5':None,'\xc7\xa6':None,'\xc7\xa7':None,'\xc7\xa8':None,'\xc7\xa9':None +,'\xc7\xaa':None,'\xc7\xab':None,'\xc7\xac':None,'\xc7\xad':None,'\xc7\xae': +None,'\xc7\xaf':None,'\xc7\xb0':None,'\xc7\xb1':None,'\xc7\xb2':None,'\xc7\xb3' +:None,'\xc7\xb4':None,'\xc7\xb5':None,'\xc7\xb6':None,'\xc7\xb7':None, +'\xc7\xb8':None,'\xc7\xb9':None,'\xc7\xba':None,'\xc7\xbb':None,'\xc7\xbc':None +,'\xc7\xbd':None,'\xc7\xbe':None,'\xc7\xbf':None,'\xc7\xc0':None,'\xc7\xc1': +None,'\xc7\xc2':None,'\xc7\xc3':None,'\xc7\xc4':None,'\xc7\xc5':None,'\xc7\xc6' +:None,'\xc7\xc7':None,'\xc7\xc8':None,'\xc7\xc9':None,'\xc7\xca':None, +'\xc7\xcb':None,'\xc7\xcc':None,'\xc7\xcd':None,'\xc7\xce':None,'\xc7\xcf':None +,'\xc7\xd0':None,'\xc7\xd1':None,'\xc7\xd2':None,'\xc7\xd3':None,'\xc7\xd4': +None,'\xc7\xd5':None,'\xc7\xd6':None,'\xc7\xd7':None,'\xc7\xd8':None,'\xc7\xd9' +:None,'\xc7\xda':None,'\xc7\xdb':None,'\xc7\xdc':None,'\xc7\xdd':None, +'\xc7\xde':None,'\xc7\xdf':None,'\xc7\xe0':None,'\xc7\xe1':None,'\xc7\xe2':None +,'\xc7\xe3':None,'\xc7\xe4':None,'\xc7\xe5':None,'\xc7\xe6':None,'\xc7\xe7': +None,'\xc7\xe8':None,'\xc7\xe9':None,'\xc7\xea':None,'\xc7\xeb':None,'\xc7\xec' +:None,'\xc7\xed':None,'\xc7\xee':None,'\xc7\xef':None,'\xc7\xf0':None, +'\xc7\xf1':None,'\xc7\xf2':None,'\xc7\xf3':None,'\xc7\xf4':None,'\xc7\xf5':None +,'\xc7\xf6':None,'\xc7\xf7':None,'\xc7\xf8':None,'\xc7\xf9':None,'\xc7\xfa': +None,'\xc7\xfb':None,'\xc7\xfc':None,'\xfd':u'\xa9','\xfe':u'\u2122','\xff': +u'\u2026' +} + +basecodec = _codecs_tw.getcodec('big5') +codec = mbc.create_extcodec('mac_chintrad', basecodec, encode_map, decode_map, + 2, 2, 0) + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='mac_chintrad', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) Index: Lib/encodings/aliases.py =================================================================== --- Lib/encodings/aliases.py (revision 64531) +++ Lib/encodings/aliases.py (working copy) @@ -416,6 +416,18 @@ 'latin' : 'latin_1', 'latin1' : 'latin_1', + # mac_chinsimp codec + 'cp10008' : 'mac_chinsimp', + 'macchinsimp' : 'mac_chinsimp', + 'macchinesesimplified' : 'mac_chinsimp', + 'x_mac_chinesesimp' : 'mac_chinsimp', + + # mac_chintrad codec + 'cp10002' : 'mac_chintrad', + 'macchintrad' : 'mac_chintrad', + 'macchinesetraditional' : 'mac_chintrad', + 'x_mac_chinesetrad' : 'mac_chintrad', + # mac_cyrillic codec 'maccyrillic' : 'mac_cyrillic', @@ -429,6 +441,16 @@ 'maccentraleurope' : 'mac_latin2', 'maclatin2' : 'mac_latin2', + # mac_japanese codec + 'cp10001' : 'mac_japanese', + 'macjapanese' : 'mac_japanese', + 'x_mac_japanese' : 'mac_japanese', + + # mac_korean codec + 'cp10003' : 'mac_korean', + 'mackorean' : 'mac_korean', + 'x_mac_korean' : 'mac_korean', + # mac_roman codec 'macroman' : 'mac_roman', Index: Lib/encodings/mac_chinsimp.py =================================================================== --- Lib/encodings/mac_chinsimp.py (revision 0) +++ Lib/encodings/mac_chinsimp.py (revision 0) @@ -0,0 +1,93 @@ +# +# mac_chinsimp.py: Python Unicode Codec for MAC_CHINSIMP +# +# Written by Hye-Shik Chang +# + +import _codecs_cn, codecs +import _multibytecodec as mbc + +encode_map = { +u'\x83':'\x83',u'\x84':'\x84',u'\x85':'\x85',u'\x86':'\x86',u'\x87':'\x87', +u'\x88':'\x88',u'\x89':'\x89',u'\x8a':'\x8a',u'\x8b':'\x8b',u'\x8c':'\x8c', +u'\x8d':'\x8d',u'\x8e':'\x8e',u'\x8f':'\x8f',u'\x90':'\x90',u'\x91':'\x91', +u'\x92':'\x92',u'\x93':'\x93',u'\x94':'\x94',u'\x95':'\x95',u'\x96':'\x96', +u'\x97':'\x97',u'\x98':'\x98',u'\x99':'\x99',u'\x9a':'\x9a',u'\x9b':'\x9b', +u'\x9c':'\x9c',u'\x9d':'\x9d',u'\x9e':'\x9e',u'\x9f':'\x9f',u'\xa0':'\xa0', +u'\xa2':'\xa1\xe9',u'\xa3':'\xa1\xea',u'\xa5':'\xa3\xa4',u'\xa9':'\xfd',u'\xb7' +:'\xa1\xa4',u'\xfc':(2,'\xa8\xb9'),u'\xfc\uf87f':'\x80',u'\u0144':'\xa8\xbd', +u'\u0148':'\xa8\xbe',u'\u01f9':'\xa8\xbf',u'\u0251':'\xa8\xbb',u'\u0261': +'\xa8\xc0',u'\u1e3f':'\xa8\xbc',u'\u2014':'\xa1\xaa',u'\u2015':None,u'\u2026': +'\xff',u'\u203e':'\xa3\xfe',u'\u2122':'\xfe',u'\u22ef':(2,'\xa1\xad'), +u'\u22ef\uf87e':'\xa6\xf3',u'\u3001':(2,'\xa1\xa2'),u'\u3001\uf87e':'\xa6\xdb', +u'\u3002':(2,'\xa1\xa3'),u'\u3002\uf87e':'\xa6\xda',u'\u3016':(2,'\xa1\xbc'), +u'\u3016\uf87e':'\xa6\xec',u'\u3017':(2,'\xa1\xbd'),u'\u3017\uf87e':'\xa6\xed', +u'\u301c':'\xa1\xab',u'\u30fb':None,u'\uf880':'\x81',u'\uf881':'\x82',u'\ufe31' +:'\xa6\xf2',u'\ufe33':'\xa6\xf4',u'\ufe34':'\xa6\xf5',u'\ufe35':'\xa6\xe0', +u'\ufe36':'\xa6\xe1',u'\ufe37':'\xa6\xf0',u'\ufe38':'\xa6\xf1',u'\ufe39': +'\xa6\xe2',u'\ufe3a':'\xa6\xe3',u'\ufe3b':'\xa6\xee',u'\ufe3c':'\xa6\xef', +u'\ufe3d':'\xa6\xe6',u'\ufe3e':'\xa6\xe7',u'\ufe3f':'\xa6\xe4',u'\ufe40': +'\xa6\xe5',u'\ufe41':'\xa6\xe8',u'\ufe42':'\xa6\xe9',u'\ufe43':'\xa6\xea', +u'\ufe44':'\xa6\xeb',u'\uff01':(2,'\xa3\xa1'),u'\uff01\uf87e':'\xa6\xde', +u'\uff0c':(2,'\xa3\xac'),u'\uff0c\uf87e':'\xa6\xd9',u'\uff1a':(2,'\xa3\xba'), +u'\uff1a\uf87e':'\xa6\xdc',u'\uff1b':(2,'\xa3\xbb'),u'\uff1b\uf87e':'\xa6\xdd', +u'\uff1f':(2,'\xa3\xbf'),u'\uff1f\uf87e':'\xa6\xdf',u'\uff5e':None,u'\uffe0': +None,u'\uffe1':None,u'\uffe3':None,u'\uffe5':None +} + +decode_map = { +'\x80':u'\xfc\uf87f','\x81':u'\uf880','\x82':u'\uf881','\x83':u'\x83','\x84': +u'\x84','\x85':u'\x85','\x86':u'\x86','\x87':u'\x87','\x88':u'\x88','\x89': +u'\x89','\x8a':u'\x8a','\x8b':u'\x8b','\x8c':u'\x8c','\x8d':u'\x8d','\x8e': +u'\x8e','\x8f':u'\x8f','\x90':u'\x90','\x91':u'\x91','\x92':u'\x92','\x93': +u'\x93','\x94':u'\x94','\x95':u'\x95','\x96':u'\x96','\x97':u'\x97','\x98': +u'\x98','\x99':u'\x99','\x9a':u'\x9a','\x9b':u'\x9b','\x9c':u'\x9c','\x9d': +u'\x9d','\x9e':u'\x9e','\x9f':u'\x9f','\xa0':u'\xa0','\xa1':2,'\xa1\xa4': +u'\xb7','\xa1\xaa':u'\u2014','\xa1\xab':u'\u301c','\xa1\xad':u'\u22ef', +'\xa1\xe9':u'\xa2','\xa1\xea':u'\xa3','\xa3':2,'\xa3\xa4':u'\xa5','\xa3\xfe': +u'\u203e','\xa6':2,'\xa6\xd9':u'\uff0c\uf87e','\xa6\xda':u'\u3002\uf87e', +'\xa6\xdb':u'\u3001\uf87e','\xa6\xdc':u'\uff1a\uf87e','\xa6\xdd': +u'\uff1b\uf87e','\xa6\xde':u'\uff01\uf87e','\xa6\xdf':u'\uff1f\uf87e', +'\xa6\xe0':u'\ufe35','\xa6\xe1':u'\ufe36','\xa6\xe2':u'\ufe39','\xa6\xe3': +u'\ufe3a','\xa6\xe4':u'\ufe3f','\xa6\xe5':u'\ufe40','\xa6\xe6':u'\ufe3d', +'\xa6\xe7':u'\ufe3e','\xa6\xe8':u'\ufe41','\xa6\xe9':u'\ufe42','\xa6\xea': +u'\ufe43','\xa6\xeb':u'\ufe44','\xa6\xec':u'\u3016\uf87e','\xa6\xed': +u'\u3017\uf87e','\xa6\xee':u'\ufe3b','\xa6\xef':u'\ufe3c','\xa6\xf0':u'\ufe37', +'\xa6\xf1':u'\ufe38','\xa6\xf2':u'\ufe31','\xa6\xf3':u'\u22ef\uf87e','\xa6\xf4' +:u'\ufe33','\xa6\xf5':u'\ufe34','\xa8':2,'\xa8\xbb':u'\u0251','\xa8\xbc': +u'\u1e3f','\xa8\xbd':u'\u0144','\xa8\xbe':u'\u0148','\xa8\xbf':u'\u01f9', +'\xa8\xc0':u'\u0261','\xfd':u'\xa9','\xfe':u'\u2122','\xff':u'\u2026' +} + +basecodec = _codecs_cn.getcodec('gb2312') +codec = mbc.create_extcodec('mac_chinsimp', basecodec, encode_map, decode_map, + 2, 2, 0) + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='mac_chinsimp', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) Index: Lib/encodings/mac_japanese.py =================================================================== --- Lib/encodings/mac_japanese.py (revision 0) +++ Lib/encodings/mac_japanese.py (revision 0) @@ -0,0 +1,258 @@ +# +# mac_japanese.py: Python Unicode Codec for MAC_JAPANESE +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +encode_map = { +u'\\':'\x80',u'\xa0':'\xa0',u'\xa9':'\xfd',u'\u2010':(2,'\x81]'), +u'\u2010\uf87e':'\xeb]',u'\u2014':'\x81\\',u'\u2015':None,u'\u2016':(2,'\x81a') +,u'\u2016\uf87e':'\xeba',u'\u2026':(2,'\x81c'),u'\u2026\uf87e':'\xebc', +u'\u2026\uf87f':'\xff',u'\u203e':None,u'\u2109':'\x86V',u'\u2113':'\x86P', +u'\u2116':'\x86\x9b',u'\u2121':'\x86\x9d',u'\u2122':'\xfe',u'\u2160':'\x85\x9f' +,u'\u2161':'\x85\xa0',u'\u2162':'\x85\xa1',u'\u2163':'\x85\xa2',u'\u2164': +'\x85\xa3',u'\u2165':'\x85\xa4',u'\u2166':'\x85\xa5',u'\u2167':'\x85\xa6', +u'\u2168':'\x85\xa7',u'\u2169':'\x85\xa8',u'\u216a':'\x85\xa9',u'\u216b': +'\x85\xaa',u'\u2170':'\x85\xb3',u'\u2171':'\x85\xb4',u'\u2172':'\x85\xb5', +u'\u2173':'\x85\xb6',u'\u2174':'\x85\xb7',u'\u2175':'\x85\xb8',u'\u2176': +'\x85\xb9',u'\u2177':'\x85\xba',u'\u2178':'\x85\xbb',u'\u2179':'\x85\xbc', +u'\u217a':'\x85\xbd',u'\u217b':'\x85\xbe',u'\u21c4':'\x86\xcc',u'\u21c5': +'\x86\xcd',u'\u21c6':'\x86\xcb',u'\u21e6':(2,'\x86\xd0'),u'\u21e6\uf87a': +'\x86\xd4',u'\u21e7':(2,'\x86\xd1'),u'\u21e7\uf87a':'\x86\xd5',u'\u21e8': +(2,'\x86\xcf'),u'\u21e8\uf87a':'\x86\xd3',u'\u21e9':(2,'\x86\xd2'), +u'\u21e9\uf87a':'\x86\xd6',u'\u221f':'\x88A',u'\u222e':'\x88@',u'\u22bf': +'\x88B',u'\u2460':'\x85@',u'\u2461':'\x85A',u'\u2462':'\x85B',u'\u2463':'\x85C' +,u'\u2464':'\x85D',u'\u2465':'\x85E',u'\u2466':'\x85F',u'\u2467':'\x85G', +u'\u2468':'\x85H',u'\u2469':'\x85I',u'\u246a':'\x85J',u'\u246b':'\x85K', +u'\u246c':'\x85L',u'\u246d':'\x85M',u'\u246e':'\x85N',u'\u246f':'\x85O', +u'\u2470':'\x85P',u'\u2471':'\x85Q',u'\u2472':'\x85R',u'\u2473':'\x85S', +u'\u2474':'\x85^',u'\u2475':'\x85_',u'\u2476':'\x85`',u'\u2477':'\x85a', +u'\u2478':'\x85b',u'\u2479':'\x85c',u'\u247a':'\x85d',u'\u247b':'\x85e', +u'\u247c':'\x85f',u'\u247d':'\x85g',u'\u247e':'\x85h',u'\u247f':'\x85i', +u'\u2480':'\x85j',u'\u2481':'\x85k',u'\u2482':'\x85l',u'\u2483':'\x85m', +u'\u2484':'\x85n',u'\u2485':'\x85o',u'\u2486':'\x85p',u'\u2487':'\x85q', +u'\u2488':'\x85\x92',u'\u2489':'\x85\x93',u'\u248a':'\x85\x94',u'\u248b': +'\x85\x95',u'\u248c':'\x85\x96',u'\u248d':'\x85\x97',u'\u248e':'\x85\x98', +u'\u248f':'\x85\x99',u'\u2490':'\x85\x9a',u'\u249c':'\x85\xdb',u'\u249d': +'\x85\xdc',u'\u249e':'\x85\xdd',u'\u249f':'\x85\xde',u'\u24a0':'\x85\xdf', +u'\u24a1':'\x85\xe0',u'\u24a2':'\x85\xe1',u'\u24a3':'\x85\xe2',u'\u24a4': +'\x85\xe3',u'\u24a5':'\x85\xe4',u'\u24a6':'\x85\xe5',u'\u24a7':'\x85\xe6', +u'\u24a8':'\x85\xe7',u'\u24a9':'\x85\xe8',u'\u24aa':'\x85\xe9',u'\u24ab': +'\x85\xea',u'\u24ac':'\x85\xeb',u'\u24ad':'\x85\xec',u'\u24ae':'\x85\xed', +u'\u24af':'\x85\xee',u'\u24b0':'\x85\xef',u'\u24b1':'\x85\xf0',u'\u24b2': +'\x85\xf1',u'\u24b3':'\x85\xf2',u'\u24b4':'\x85\xf3',u'\u24b5':'\x85\xf4', +u'\u260e':'\x86\xb4',u'\u261c':'\x86\xc8',u'\u261d':'\x86\xc9',u'\u261e': +'\x86\xc7',u'\u261f':'\x86\xca',u'\u2660':'\x86\xa3',u'\u2661':'\x86\xa1', +u'\u2662':'\x86\xa2',u'\u2663':'\x86\xa4',u'\u2664':'\x86\x9f',u'\u2665': +'\x86\xa5',u'\u2666':'\x86\xa6',u'\u2667':'\x86\xa0',u'\u2776':'\x85|', +u'\u2777':'\x85}',u'\u2778':'\x85~',u'\u2779':'\x85\x80',u'\u277a':'\x85\x81', +u'\u277b':'\x85\x82',u'\u277c':'\x85\x83',u'\u277d':'\x85\x84',u'\u277e': +'\x85\x85',u'\u3001':(2,'\x81A'),u'\u3001\uf87e':'\xebA',u'\u3002':(2,'\x81B'), +u'\u3002\uf87e':'\xebB',u'\u3004':'\x86\xb5',u'\u301c':(2,'\x81`'), +u'\u301c\uf87e':'\xeb`',u'\u301d':'\x88T',u'\u301f':'\x88U',u'\u3020': +'\x86\xb3',u'\u3041':(2,'\x82\x9f'),u'\u3041\uf87e':'\xec\x9f',u'\u3043': +(2,'\x82\xa1'),u'\u3043\uf87e':'\xec\xa1',u'\u3045':(2,'\x82\xa3'), +u'\u3045\uf87e':'\xec\xa3',u'\u3047':(2,'\x82\xa5'),u'\u3047\uf87e':'\xec\xa5', +u'\u3049':(2,'\x82\xa7'),u'\u3049\uf87e':'\xec\xa7',u'\u3063':(2,'\x82\xc1'), +u'\u3063\uf87e':'\xec\xc1',u'\u3083':(2,'\x82\xe1'),u'\u3083\uf87e':'\xec\xe1', +u'\u3085':(2,'\x82\xe3'),u'\u3085\uf87e':'\xec\xe3',u'\u3087':(2,'\x82\xe5'), +u'\u3087\uf87e':'\xec\xe5',u'\u308e':(2,'\x82\xec'),u'\u308e\uf87e':'\xec\xec', +u'\u3094':'\x88h',u'\u30a1':(2,'\x83@'),u'\u30a1\uf87e':'\xed@',u'\u30a3': +(2,'\x83B'),u'\u30a3\uf87e':'\xedB',u'\u30a5':(2,'\x83D'),u'\u30a5\uf87e': +'\xedD',u'\u30a7':(2,'\x83F'),u'\u30a7\uf87e':'\xedF',u'\u30a9':(2,'\x83H'), +u'\u30a9\uf87e':'\xedH',u'\u30c3':(2,'\x83b'),u'\u30c3\uf87e':'\xedb',u'\u30e3' +:(2,'\x83\x83'),u'\u30e3\uf87e':'\xed\x83',u'\u30e5':(2,'\x83\x85'), +u'\u30e5\uf87e':'\xed\x85',u'\u30e7':(2,'\x83\x87'),u'\u30e7\uf87e':'\xed\x87', +u'\u30ee':(2,'\x83\x8e'),u'\u30ee\uf87e':'\xed\x8e',u'\u30f5':(2,'\x83\x95'), +u'\u30f5\uf87e':'\xed\x95',u'\u30f6':(2,'\x83\x96'),u'\u30f6\uf87e':'\xed\x96', +u'\u30f7':'\x88j',u'\u30f8':'\x88k',u'\u30f9':'\x88l',u'\u30fa':'\x88m', +u'\u30fc':(2,'\x81['),u'\u30fc\uf87e':'\xeb[',u'\u322a':'\x87A',u'\u322b': +'\x87B',u'\u322c':'\x87C',u'\u322d':'\x87D',u'\u322e':'\x87E',u'\u322f':'\x87F' +,u'\u3230':'\x87@',u'\u3231':'\x87M',u'\u3232':'\x87P',u'\u3233':'\x87S', +u'\u3234':'\x87O',u'\u3235':'\x87T',u'\u3236':'\x87R',u'\u3237':'\x87H', +u'\u3238':'\x87X',u'\u3239':'\x87K',u'\u323a':'\x87L',u'\u323b':'\x87Q', +u'\u323c':'\x87U',u'\u323d':'\x87V',u'\u323e':'\x87N',u'\u323f':'\x87W', +u'\u3240':'\x87G',u'\u3242':'\x87I',u'\u3243':'\x87J',u'\u3296':'\x87\x99', +u'\u3298':'\x87\x9b',u'\u3299':'\x87\x9e',u'\u329d':'\x87\x9a',u'\u329e': +'\x87\x9c',u'\u32a4':'\x87\x93',u'\u32a5':'\x87\x94',u'\u32a6':'\x87\x95', +u'\u32a7':'\x87\x96',u'\u32a8':'\x87\x97',u'\u32a9':'\x87\x98',u'\u3300': +'\x87\xbd',u'\u3303':'\x87\xa7',u'\u3305':'\x87\xa4',u'\u330d':'\x87\xb0', +u'\u3314':'\x87\xa2',u'\u3315':'\x87\xaa',u'\u3316':'\x87\xa3',u'\u3318': +'\x87\xa9',u'\u331e':'\x87\xbe',u'\u3322':'\x87\xa0',u'\u3323':'\x87\xb2', +u'\u3326':'\x87\xb3',u'\u3327':'\x87\xab',u'\u332a':'\x87\xbf',u'\u332b': +'\x87\xb5',u'\u3331':'\x87\xc0',u'\u3333':'\x87\xa5',u'\u3336':'\x87\xa8', +u'\u3339':'\x87\xae',u'\u333b':'\x87\xb4',u'\u3342':'\x87\xb1',u'\u3347': +'\x87\xc1',u'\u3349':'\x87\x9f',u'\u334a':'\x87\xad',u'\u334d':'\x87\xa1', +u'\u334e':'\x87\xa6',u'\u3351':'\x87\xac',u'\u3357':'\x87\xaf',u'\u337b': +'\x87\xe8',u'\u337c':'\x87\xe7',u'\u337d':'\x87\xe6',u'\u337e':'\x87\xe5', +u'\u337f':'\x87\xfa',u'\u3385':'\x86Z',u'\u3386':'\x86[',u'\u3387':'\x86\\', +u'\u338e':'\x86J',u'\u338f':'\x86L',u'\u3390':'\x86Y',u'\u3396':'\x86N', +u'\u3397':'\x86O',u'\u3398':'\x86Q',u'\u339c':'\x86@',u'\u339d':'\x86B', +u'\u339e':'\x86H',u'\u339f':'\x86A',u'\u33a0':'\x86C',u'\u33a1':'\x86F', +u'\u33a2':'\x86I',u'\u33a4':'\x86D',u'\u33a5':'\x86G',u'\u33b0':'\x86U', +u'\u33b1':'\x86T',u'\u33b2':'\x86S',u'\u33b3':'\x86R',u'\u33c4':'\x86M', +u'\u33cb':'\x86X',u'\u33cd':'\x86\x9c',u'\u33d4':'\x86W',u'\u5927': +(2,'\x91\xe5'),u'\u5927\u20dd':'\x87\x91',u'\u5c0f':(2,'\x8f\xac'), +u'\u5c0f\u20dd':'\x87\x92',u'\u63a7':(2,'\x8dT'),u'\u63a7\u20dd':'\x87\x9d', +u'\uf860':2,u'\uf8600':3,u'\uf8600.':'\x85\x91',u'\uf860T':3,u'\uf860TB': +'\x86]',u'\uf860X':3,u'\uf860XV':'\x85\xad',u'\uf860x':3,u'\uf860xv':'\x85\xc1' +,u'\uf860\u2193':3,u'\uf860\u2193\u2191':'\x86\xce',u'\uf861':2,u'\uf861F':3, +u'\uf861FA':4,u'\uf861FAX':'\x86\x9e',u'\uf861X':3,u'\uf861XI':4,u'\uf861XIV': +'\x85\xac',u'\uf861x':3,u'\uf861xi':4,u'\uf861xiv':'\x85\xc0',u'\uf862':2, +u'\uf862X':3,u'\uf862XI':4,u'\uf862XII':5,u'\uf862XIII':'\x85\xab',u'\uf862x':3 +,u'\uf862xi':4,u'\uf862xii':5,u'\uf862xiii':'\x85\xbf',u'\uf862\u6709':3, +u'\uf862\u6709\u9650':4,u'\uf862\u6709\u9650\u4f1a':5, +u'\uf862\u6709\u9650\u4f1a\u793e':'\x87\xfb',u'\uf862\u8ca1':3, +u'\uf862\u8ca1\u56e3':4,u'\uf862\u8ca1\u56e3\u6cd5':5, +u'\uf862\u8ca1\u56e3\u6cd5\u4eba':'\x87\xfc',u'\ufe30':'\xebd',u'\ufe31': +'\xeb\\',u'\ufe33':'\xebQ',u'\ufe35':'\xebi',u'\ufe36':'\xebj',u'\ufe37': +'\xebo',u'\ufe38':'\xebp',u'\ufe39':'\xebk',u'\ufe3a':'\xebl',u'\ufe3b':'\xeby' +,u'\ufe3c':'\xebz',u'\ufe3d':'\xebs',u'\ufe3e':'\xebt',u'\ufe3f':'\xebq', +u'\ufe40':'\xebr',u'\ufe41':'\xebu',u'\ufe42':'\xebv',u'\ufe43':'\xebw', +u'\ufe44':'\xebx',u'\uff1d':(2,'\x81\x81'),u'\uff1d\uf87e':'\xeb\x81',u'\uff3b' +:(2,'\x81m'),u'\uff3b\uf87e':'\xebm',u'\uff3c':'\x81_',u'\uff3d':(2,'\x81n'), +u'\uff3d\uf87e':'\xebn',u'\uff47':(2,'\x82\x87'),u'\uff47\uf87f':'\x86K', +u'\uff4d':(2,'\x82\x8d'),u'\uff4d\uf87f':'\x86E',u'\uff5c':(2,'\x81b'), +u'\uff5c\uf87e':'\xebb',u'\uffe3':(2,'\x81P'),u'\uffe3\uf87e':'\xebP' +} + +decode_map = { +'\\':u'\xa5','\x80':u'\\','\x81':2,'\x81\\':u'\u2014','\x81_':u'\uff3c','\x85': +2,'\x85@':u'\u2460','\x85A':u'\u2461','\x85B':u'\u2462','\x85C':u'\u2463', +'\x85D':u'\u2464','\x85E':u'\u2465','\x85F':u'\u2466','\x85G':u'\u2467','\x85H' +:u'\u2468','\x85I':u'\u2469','\x85J':u'\u246a','\x85K':u'\u246b','\x85L': +u'\u246c','\x85M':u'\u246d','\x85N':u'\u246e','\x85O':u'\u246f','\x85P': +u'\u2470','\x85Q':u'\u2471','\x85R':u'\u2472','\x85S':u'\u2473','\x85^': +u'\u2474','\x85_':u'\u2475','\x85`':u'\u2476','\x85a':u'\u2477','\x85b': +u'\u2478','\x85c':u'\u2479','\x85d':u'\u247a','\x85e':u'\u247b','\x85f': +u'\u247c','\x85g':u'\u247d','\x85h':u'\u247e','\x85i':u'\u247f','\x85j': +u'\u2480','\x85k':u'\u2481','\x85l':u'\u2482','\x85m':u'\u2483','\x85n': +u'\u2484','\x85o':u'\u2485','\x85p':u'\u2486','\x85q':u'\u2487','\x85|': +u'\u2776','\x85}':u'\u2777','\x85~':u'\u2778','\x85\x80':u'\u2779','\x85\x81': +u'\u277a','\x85\x82':u'\u277b','\x85\x83':u'\u277c','\x85\x84':u'\u277d', +'\x85\x85':u'\u277e','\x85\x91':u'\uf8600.','\x85\x92':u'\u2488','\x85\x93': +u'\u2489','\x85\x94':u'\u248a','\x85\x95':u'\u248b','\x85\x96':u'\u248c', +'\x85\x97':u'\u248d','\x85\x98':u'\u248e','\x85\x99':u'\u248f','\x85\x9a': +u'\u2490','\x85\x9f':u'\u2160','\x85\xa0':u'\u2161','\x85\xa1':u'\u2162', +'\x85\xa2':u'\u2163','\x85\xa3':u'\u2164','\x85\xa4':u'\u2165','\x85\xa5': +u'\u2166','\x85\xa6':u'\u2167','\x85\xa7':u'\u2168','\x85\xa8':u'\u2169', +'\x85\xa9':u'\u216a','\x85\xaa':u'\u216b','\x85\xab':u'\uf862XIII','\x85\xac': +u'\uf861XIV','\x85\xad':u'\uf860XV','\x85\xb3':u'\u2170','\x85\xb4':u'\u2171', +'\x85\xb5':u'\u2172','\x85\xb6':u'\u2173','\x85\xb7':u'\u2174','\x85\xb8': +u'\u2175','\x85\xb9':u'\u2176','\x85\xba':u'\u2177','\x85\xbb':u'\u2178', +'\x85\xbc':u'\u2179','\x85\xbd':u'\u217a','\x85\xbe':u'\u217b','\x85\xbf': +u'\uf862xiii','\x85\xc0':u'\uf861xiv','\x85\xc1':u'\uf860xv','\x85\xdb': +u'\u249c','\x85\xdc':u'\u249d','\x85\xdd':u'\u249e','\x85\xde':u'\u249f', +'\x85\xdf':u'\u24a0','\x85\xe0':u'\u24a1','\x85\xe1':u'\u24a2','\x85\xe2': +u'\u24a3','\x85\xe3':u'\u24a4','\x85\xe4':u'\u24a5','\x85\xe5':u'\u24a6', +'\x85\xe6':u'\u24a7','\x85\xe7':u'\u24a8','\x85\xe8':u'\u24a9','\x85\xe9': +u'\u24aa','\x85\xea':u'\u24ab','\x85\xeb':u'\u24ac','\x85\xec':u'\u24ad', +'\x85\xed':u'\u24ae','\x85\xee':u'\u24af','\x85\xef':u'\u24b0','\x85\xf0': +u'\u24b1','\x85\xf1':u'\u24b2','\x85\xf2':u'\u24b3','\x85\xf3':u'\u24b4', +'\x85\xf4':u'\u24b5','\x86':2,'\x86@':u'\u339c','\x86A':u'\u339f','\x86B': +u'\u339d','\x86C':u'\u33a0','\x86D':u'\u33a4','\x86E':u'\uff4d\uf87f','\x86F': +u'\u33a1','\x86G':u'\u33a5','\x86H':u'\u339e','\x86I':u'\u33a2','\x86J': +u'\u338e','\x86K':u'\uff47\uf87f','\x86L':u'\u338f','\x86M':u'\u33c4','\x86N': +u'\u3396','\x86O':u'\u3397','\x86P':u'\u2113','\x86Q':u'\u3398','\x86R': +u'\u33b3','\x86S':u'\u33b2','\x86T':u'\u33b1','\x86U':u'\u33b0','\x86V': +u'\u2109','\x86W':u'\u33d4','\x86X':u'\u33cb','\x86Y':u'\u3390','\x86Z': +u'\u3385','\x86[':u'\u3386','\x86\\':u'\u3387','\x86]':u'\uf860TB','\x86\x9b': +u'\u2116','\x86\x9c':u'\u33cd','\x86\x9d':u'\u2121','\x86\x9e':u'\uf861FAX', +'\x86\x9f':u'\u2664','\x86\xa0':u'\u2667','\x86\xa1':u'\u2661','\x86\xa2': +u'\u2662','\x86\xa3':u'\u2660','\x86\xa4':u'\u2663','\x86\xa5':u'\u2665', +'\x86\xa6':u'\u2666','\x86\xb3':u'\u3020','\x86\xb4':u'\u260e','\x86\xb5': +u'\u3004','\x86\xc7':u'\u261e','\x86\xc8':u'\u261c','\x86\xc9':u'\u261d', +'\x86\xca':u'\u261f','\x86\xcb':u'\u21c6','\x86\xcc':u'\u21c4','\x86\xcd': +u'\u21c5','\x86\xce':u'\uf860\u2193\u2191','\x86\xcf':u'\u21e8','\x86\xd0': +u'\u21e6','\x86\xd1':u'\u21e7','\x86\xd2':u'\u21e9','\x86\xd3':u'\u21e8\uf87a', +'\x86\xd4':u'\u21e6\uf87a','\x86\xd5':u'\u21e7\uf87a','\x86\xd6': +u'\u21e9\uf87a','\x87':2,'\x87@':u'\u3230','\x87A':u'\u322a','\x87B':u'\u322b', +'\x87C':u'\u322c','\x87D':u'\u322d','\x87E':u'\u322e','\x87F':u'\u322f','\x87G' +:u'\u3240','\x87H':u'\u3237','\x87I':u'\u3242','\x87J':u'\u3243','\x87K': +u'\u3239','\x87L':u'\u323a','\x87M':u'\u3231','\x87N':u'\u323e','\x87O': +u'\u3234','\x87P':u'\u3232','\x87Q':u'\u323b','\x87R':u'\u3236','\x87S': +u'\u3233','\x87T':u'\u3235','\x87U':u'\u323c','\x87V':u'\u323d','\x87W': +u'\u323f','\x87X':u'\u3238','\x87\x91':u'\u5927\u20dd','\x87\x92': +u'\u5c0f\u20dd','\x87\x93':u'\u32a4','\x87\x94':u'\u32a5','\x87\x95':u'\u32a6', +'\x87\x96':u'\u32a7','\x87\x97':u'\u32a8','\x87\x98':u'\u32a9','\x87\x99': +u'\u3296','\x87\x9a':u'\u329d','\x87\x9b':u'\u3298','\x87\x9c':u'\u329e', +'\x87\x9d':u'\u63a7\u20dd','\x87\x9e':u'\u3299','\x87\x9f':u'\u3349','\x87\xa0' +:u'\u3322','\x87\xa1':u'\u334d','\x87\xa2':u'\u3314','\x87\xa3':u'\u3316', +'\x87\xa4':u'\u3305','\x87\xa5':u'\u3333','\x87\xa6':u'\u334e','\x87\xa7': +u'\u3303','\x87\xa8':u'\u3336','\x87\xa9':u'\u3318','\x87\xaa':u'\u3315', +'\x87\xab':u'\u3327','\x87\xac':u'\u3351','\x87\xad':u'\u334a','\x87\xae': +u'\u3339','\x87\xaf':u'\u3357','\x87\xb0':u'\u330d','\x87\xb1':u'\u3342', +'\x87\xb2':u'\u3323','\x87\xb3':u'\u3326','\x87\xb4':u'\u333b','\x87\xb5': +u'\u332b','\x87\xbd':u'\u3300','\x87\xbe':u'\u331e','\x87\xbf':u'\u332a', +'\x87\xc0':u'\u3331','\x87\xc1':u'\u3347','\x87\xe5':u'\u337e','\x87\xe6': +u'\u337d','\x87\xe7':u'\u337c','\x87\xe8':u'\u337b','\x87\xfa':u'\u337f', +'\x87\xfb':u'\uf862\u6709\u9650\u4f1a\u793e','\x87\xfc': +u'\uf862\u8ca1\u56e3\u6cd5\u4eba','\x88':2,'\x88@':u'\u222e','\x88A':u'\u221f', +'\x88B':u'\u22bf','\x88T':u'\u301d','\x88U':u'\u301f','\x88h':u'\u3094','\x88j' +:u'\u30f7','\x88k':u'\u30f8','\x88l':u'\u30f9','\x88m':u'\u30fa','\xa0':u'\xa0' +,'\xeb':2,'\xebA':u'\u3001\uf87e','\xebB':u'\u3002\uf87e','\xebP': +u'\uffe3\uf87e','\xebQ':u'\ufe33','\xeb[':u'\u30fc\uf87e','\xeb\\':u'\ufe31', +'\xeb]':u'\u2010\uf87e','\xeb`':u'\u301c\uf87e','\xeba':u'\u2016\uf87e','\xebb' +:u'\uff5c\uf87e','\xebc':u'\u2026\uf87e','\xebd':u'\ufe30','\xebi':u'\ufe35', +'\xebj':u'\ufe36','\xebk':u'\ufe39','\xebl':u'\ufe3a','\xebm':u'\uff3b\uf87e', +'\xebn':u'\uff3d\uf87e','\xebo':u'\ufe37','\xebp':u'\ufe38','\xebq':u'\ufe3f', +'\xebr':u'\ufe40','\xebs':u'\ufe3d','\xebt':u'\ufe3e','\xebu':u'\ufe41','\xebv' +:u'\ufe42','\xebw':u'\ufe43','\xebx':u'\ufe44','\xeby':u'\ufe3b','\xebz': +u'\ufe3c','\xeb\x81':u'\uff1d\uf87e','\xec':2,'\xec\x9f':u'\u3041\uf87e', +'\xec\xa1':u'\u3043\uf87e','\xec\xa3':u'\u3045\uf87e','\xec\xa5': +u'\u3047\uf87e','\xec\xa7':u'\u3049\uf87e','\xec\xc1':u'\u3063\uf87e', +'\xec\xe1':u'\u3083\uf87e','\xec\xe3':u'\u3085\uf87e','\xec\xe5': +u'\u3087\uf87e','\xec\xec':u'\u308e\uf87e','\xed':2,'\xed@':u'\u30a1\uf87e', +'\xedB':u'\u30a3\uf87e','\xedD':u'\u30a5\uf87e','\xedF':u'\u30a7\uf87e','\xedH' +:u'\u30a9\uf87e','\xedb':u'\u30c3\uf87e','\xed\x83':u'\u30e3\uf87e','\xed\x85': +u'\u30e5\uf87e','\xed\x87':u'\u30e7\uf87e','\xed\x8e':u'\u30ee\uf87e', +'\xed\x95':u'\u30f5\uf87e','\xed\x96':u'\u30f6\uf87e','\xfd':u'\xa9','\xfe': +u'\u2122','\xff':u'\u2026\uf87f' +} + +# User-defined range +lowset = map(chr, range(0x40, 0x7f) + range(0x80, 0xfd)) +for high in range(0xf0, 0xfd): + decode_map[chr(high)] = 2 + for j, low in enumerate(lowset): + u = unichr(high * 188 + j + 12224) + c = chr(high) + low + encode_map[u] = c + decode_map[c] = u +del high, j, low, lowset, u, c + +basecodec = _codecs_jp.getcodec('shift_jis') +codec = mbc.create_extcodec('mac_japanese', basecodec, encode_map, decode_map, + 5, 2, 0) + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='mac_japanese', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) Index: Lib/test/test_codecmaps_kr.py =================================================================== --- Lib/test/test_codecmaps_kr.py (revision 64531) +++ Lib/test/test_codecmaps_kr.py (working copy) @@ -11,8 +11,8 @@ class TestCP949Map(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'cp949' - mapfileurl = 'http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT' \ - '/WINDOWS/CP949.TXT' + mapfileurl = ('http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT' + '/WINDOWS/CP949.TXT') class TestEUCKRMap(test_multibytecodec_support.TestBase_Mapping, @@ -25,11 +25,18 @@ pass_dectest = [('\xa4\xd4', u'\u3164')] +class TestMacKoreanMap(test_multibytecodec_support.TestBase_Mapping, + unittest.TestCase): + encoding = 'mac_korean' + mapfileurl = ('http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/' + 'KOREAN.TXT') + + class TestJOHABMap(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'johab' - mapfileurl = 'http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/' \ - 'KSC/JOHAB.TXT' + mapfileurl = ('http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/' + 'KSC/JOHAB.TXT') # KS X 1001 standard assigned 0x5c as WON SIGN. # but, in early 90s that is the only era used johab widely, # the most softwares implements it as REVERSE SOLIDUS. @@ -41,4 +48,5 @@ test_support.run_unittest(__name__) if __name__ == "__main__": + test_support.use_resources = ['urlfetch'] test_main() Index: Lib/test/test_codecencodings_kr.py =================================================================== --- Lib/test/test_codecencodings_kr.py (revision 64531) +++ Lib/test/test_codecencodings_kr.py (working copy) @@ -50,6 +50,22 @@ ("\xc1\xc4", "strict", u"\uc894"), ) +class Test_MacKorean(test_multibytecodec_support.TestBase, unittest.TestCase): + encoding = 'mac_korean' + tstring = test_multibytecodec_support.load_teststring('mac_korean') + codectests = ( + # invalid sequences + ("abc\xfe\xfe\xc1\xc4", "strict", None), + ("abc\xc8", "strict", None), + ("abc\xfe\xfe\xc1\xc4", "replace", u"abc\ufffd\uc894"), + ("abc\xfe\xfe\xc1\xc4\xc8", "replace", u"abc\ufffd\uc894\ufffd"), + ("abc\xfe\xfe\xc1\xc4", "ignore", u"abc\uc894"), + ) + xmlcharnametest = ( + u"\xab\u211c\xbb = \u2329\u1234\u232a", + "\xa6\\ℜ\xa6] = ⟨ሴ⟩" + ) + class Test_JOHAB(test_multibytecodec_support.TestBase, unittest.TestCase): encoding = 'johab' tstring = test_multibytecodec_support.load_teststring('johab') Index: Lib/test/test_codecmaps_tw.py =================================================================== --- Lib/test/test_codecmaps_tw.py (revision 64531) +++ Lib/test/test_codecmaps_tw.py (working copy) @@ -24,8 +24,15 @@ ('\xa2\xce', u'\u5345'), ] +class TestMacChineseTradMap(test_multibytecodec_support.TestBase_Mapping, + unittest.TestCase): + encoding = 'mac_chintrad' + mapfileurl = ('http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/' + 'CHINTRAD.TXT') + def test_main(): test_support.run_unittest(__name__) if __name__ == "__main__": + test_support.use_resources = ['urlfetch'] test_main() Index: Lib/test/test_codecmaps_cn.py =================================================================== --- Lib/test/test_codecmaps_cn.py (revision 64531) +++ Lib/test/test_codecmaps_cn.py (working copy) @@ -16,18 +16,24 @@ class TestGBKMap(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'gbk' - mapfileurl = 'http://www.unicode.org/Public/MAPPINGS/VENDORS/' \ - 'MICSFT/WINDOWS/CP936.TXT' + mapfileurl = ('http://www.unicode.org/Public/MAPPINGS/VENDORS/' + 'MICSFT/WINDOWS/CP936.TXT') class TestGB18030Map(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'gb18030' - mapfileurl = 'http://source.icu-project.org/repos/icu/data/' \ - 'trunk/charset/data/xml/gb-18030-2000.xml' + mapfileurl = ('http://source.icu-project.org/repos/icu/data/' + 'trunk/charset/data/xml/gb-18030-2000.xml') +class TestMacChineseSimpMap(test_multibytecodec_support.TestBase_Mapping, + unittest.TestCase): + encoding = 'mac_chinsimp' + mapfileurl = ('http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/' + 'CHINSIMP.TXT') def test_main(): test_support.run_unittest(__name__) if __name__ == "__main__": + test_support.use_resources = ['urlfetch'] test_main() Index: Lib/test/test_codecmaps_jp.py =================================================================== --- Lib/test/test_codecmaps_jp.py (revision 64531) +++ Lib/test/test_codecmaps_jp.py (working copy) @@ -11,8 +11,8 @@ class TestCP932Map(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'cp932' - mapfileurl = 'http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/' \ - 'WINDOWS/CP932.TXT' + mapfileurl = ('http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/' + 'WINDOWS/CP932.TXT') supmaps = [ ('\x80', u'\u0080'), ('\xa0', u'\uf8f0'), @@ -27,16 +27,14 @@ class TestEUCJPCOMPATMap(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'euc_jp' - mapfilename = 'EUC-JP.TXT' mapfileurl = 'http://people.freebsd.org/~perky/i18n/EUC-JP.TXT' class TestSJISCOMPATMap(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'shift_jis' - mapfilename = 'SHIFTJIS.TXT' - mapfileurl = 'http://www.unicode.org/Public/MAPPINGS/OBSOLETE' \ - '/EASTASIA/JIS/SHIFTJIS.TXT' + mapfileurl = ('http://www.unicode.org/Public/MAPPINGS/OBSOLETE' + '/EASTASIA/JIS/SHIFTJIS.TXT') pass_enctest = [ ('\x81_', u'\\'), ] @@ -49,19 +47,25 @@ class TestEUCJISX0213Map(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'euc_jisx0213' - mapfilename = 'EUC-JISX0213.TXT' mapfileurl = 'http://people.freebsd.org/~perky/i18n/EUC-JISX0213.TXT' class TestSJISX0213Map(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'shift_jisx0213' - mapfilename = 'SHIFT_JISX0213.TXT' mapfileurl = 'http://people.freebsd.org/~perky/i18n/SHIFT_JISX0213.TXT' +class TestMacJapaneseMap(test_multibytecodec_support.TestBase_Mapping, + unittest.TestCase): + encoding = 'mac_japanese' + mapfileurl = ('http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/' + 'JAPANESE.TXT') + + def test_main(): test_support.run_unittest(__name__) if __name__ == "__main__": + test_support.use_resources = ['urlfetch'] test_main() Index: Lib/test/test_multibytecodec.py =================================================================== --- Lib/test/test_multibytecodec.py (revision 64531) +++ Lib/test/test_multibytecodec.py (working copy) @@ -8,6 +8,7 @@ from test import test_multibytecodec_support from test.test_support import TESTFN import unittest, StringIO, codecs, sys, os +import _multibytecodec ALL_CJKENCODINGS = [ # _codecs_cn @@ -24,6 +25,8 @@ # _codecs_iso2022 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2', 'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext', 'iso2022_kr', +# extensions + 'mac_chinsimp', 'mac_chintrad', 'mac_japanese', 'mac_korean', ] class Test_MultibyteCodec(unittest.TestCase): @@ -228,6 +231,71 @@ # Any ISO 2022 codec will cause the segfault myunichr(x).encode('iso_2022_jp', 'ignore') +class Test_ExtCodec(unittest.TestCase): + base_codec = codecs.lookup('euc_kr')[2].codec + + def test_flagpass(self): + codec = _multibytecodec.create_extcodec( + 'extcodec_testing', self.base_codec, {}, {}, 1, 2, 0) + self.assertEqual(codec.encode(u'\uc496'), + ('\xa4\xd4\xa4\xb6\xa4\xcd\xa4\xb8', 1)) + + codec = _multibytecodec.create_extcodec( + 'extcodec_testing', self.base_codec, {}, {}, 1, 2, 1) + self.assertRaises(UnicodeEncodeError, codec.encode, u'\uc496') + + def test_decoding(self): + decode_map = { + 'a': u'b', # replace original mapping + 'b': None, # invalidate original mapping + 'c': 2, # expand decoding window for the current character + 'cd': 3, # expand further + 'cde': u'spam', + 'cdf': None, + 'ce': 1, # decreasing is impossible: internal error is raised + 'cf': u'egg', + 'd': 'alien', # string is not accepted for decoding map + '\xbc': 2, # window size hint is required here, too + '\xbc\xf6': u'\uc815', # replace part of mapping in a plane + '\xbc\xbc': None, # invalidate part of mapping in a plane + } + + codec = _multibytecodec.create_extcodec( + 'extcodec_testing', self.base_codec, {}, decode_map, 1, 3, 1) + + self.assertEqual(codec.decode('acdecf\xbc\xf6z\xb1\xe8')[0], + u'bspamegg\uc815z\uae40') + self.assertEqual(codec.decode('bcdf\xbc\xbc', 'ignore')[0], u'') + self.assertRaises(RuntimeError, codec.decode, 'ce') + self.assertRaises(RuntimeError, codec.decode, 'd') + + def test_encoding(self): + encode_map = { + u'a': 'b', # replace original mapping + u'b': None, # invalidate original mapping + u'c': 2, # expand decoding window for the current character + u'cd': (3, 'sausage'), # expanding with shorter candidate + u'cde': 'spam', + u'cdf': None, + u'cdg': 4, # expand more with keeping previous candidate + u'cdgh': 'ham', + u'cdgi': None, + u'ce': 1, # decrease is impossible: internal error is raised + u'cf': 'egg', + u'd': u'alien', # unicode is not accepted for encoding map + u'\ud800': 2, # widen window without any further mapping + } + + codec = _multibytecodec.create_extcodec( + 'extcodec_testing', self.base_codec, encode_map, {}, 4, 2, 1) + + self.assertEqual(codec.encode(u'\uc218acdcdecdghcf\uc815')[0], + '\xbc\xf6bsausagespamhamegg\xc1\xa4') + self.assertEqual(codec.encode(u'b\ud800cdfcdgi\ubdc1\ud800', + 'ignore')[0], '') + self.assertRaises(RuntimeError, codec.encode, u'ce') + self.assertRaises(RuntimeError, codec.encode, u'd') + def test_main(): test_support.run_unittest(__name__) Index: Lib/test/test_codecencodings_tw.py =================================================================== --- Lib/test/test_codecencodings_tw.py (revision 64531) +++ Lib/test/test_codecencodings_tw.py (working copy) @@ -20,6 +20,19 @@ ("abc\x80\x80\xc1\xc4", "ignore", u"abc\u8b10"), ) +class Test_MacChineseTrad(test_multibytecodec_support.TestBase, + unittest.TestCase): + encoding = 'mac_chintrad' + tstring = test_multibytecodec_support.load_teststring('mac_chintrad') + codectests = ( + # invalid codepoints + ("abc\xfc\xfc\xc1\xc4", "strict", None), + ("abc\xc8", "strict", None), + ("abc\xfc\xfc\xc1\xc4", "replace", u"abc\ufffd\u8b10"), + ("abc\xfc\xfc\xc1\xc4\xc8", "replace", u"abc\ufffd\u8b10\ufffd"), + ("abc\xfc\xfc\xc1\xc4", "ignore", u"abc\u8b10"), + ) + def test_main(): test_support.run_unittest(__name__) Index: Lib/test/test_codecencodings_cn.py =================================================================== --- Lib/test/test_codecencodings_cn.py (revision 64531) +++ Lib/test/test_codecencodings_cn.py (working copy) @@ -50,6 +50,19 @@ ) has_iso10646 = True +class Test_MacChineseSimp(test_multibytecodec_support.TestBase, + unittest.TestCase): + encoding = 'mac_chinsimp' + tstring = test_multibytecodec_support.load_teststring('mac_chinsimp') + codectests = ( + # invalid codepoints + ("abc\xfc\xfc\xc1\xc4", "strict", None), + ("abc\xc8", "strict", None), + ("abc\xfc\xfc\xc1\xc4", "replace", u"abc\ufffd\u804a"), + ("abc\xfc\xfc\xc1\xc4\xc8", "replace", u"abc\ufffd\u804a\ufffd"), + ("abc\xfc\xfc\xc1\xc4", "ignore", u"abc\u804a"), + ) + def test_main(): test_support.run_unittest(__name__) Index: Lib/test/cjkencodings_test.py =================================================================== --- Lib/test/cjkencodings_test.py (revision 64531) +++ Lib/test/cjkencodings_test.py (working copy) @@ -775,6 +775,247 @@ "\xe5\xb7\x9d\xef\xa6\x81\xe4\xb8\xad\xec\x8b\x81\xe2\x91\xa8\xeb" "\x93\xa4\xec\x95\x9c\x21\x21\x20\xe3\x89\xaf\xe3\x89\xaf\xeb\x82" "\xa9\xe2\x99\xa1\x20\xe2\x8c\x92\xe2\x8c\x92\x2a\x0a\x0a"), +'mac_chinsimp': ( +"\xa1\xa4\xa1\xaa\xa1\xac\xa3\xfe\x80\xa8\xb9\xa8\xb9\x80\xa6\xdf" +"\xa1\xa2\xa6\xdb\x0a\x50\x79\x74\x68\x6f\x6e\xa3\xa8\xc5\xc9\xc9" +"\xad\xa3\xa9\xd3\xef\xd1\xd4\xca\xc7\xd2\xbb\xd6\xd6\xb9\xa6\xc4" +"\xdc\xc7\xbf\xb4\xf3\xb6\xf8\xcd\xea\xc9\xc6\xb5\xc4\xcd\xa8\xd3" +"\xc3\xd0\xcd\xbc\xc6\xcb\xe3\xbb\xfa\xb3\xcc\xd0\xf2\xc9\xe8\xbc" +"\xc6\xd3\xef\xd1\xd4\xa3\xac\x0a\xd2\xd1\xbe\xad\xbe\xdf\xd3\xd0" +"\xca\xae\xb6\xe0\xc4\xea\xb5\xc4\xb7\xa2\xd5\xb9\xc0\xfa\xca\xb7" +"\xa3\xac\xb3\xc9\xca\xec\xc7\xd2\xce\xc8\xb6\xa8\xa1\xa3\xd5\xe2" +"\xd6\xd6\xd3\xef\xd1\xd4\xbe\xdf\xd3\xd0\xb7\xc7\xb3\xa3\xbc\xf2" +"\xbd\xdd\xb6\xf8\xc7\xe5\xce\xfa\x0a\xb5\xc4\xd3\xef\xb7\xa8\xcc" +"\xd8\xb5\xe3\xa3\xac\xca\xca\xba\xcf\xcd\xea\xb3\xc9\xb8\xf7\xd6" +"\xd6\xb8\xdf\xb2\xe3\xc8\xce\xce\xf1\xa3\xac\xbc\xb8\xba\xf5\xbf" +"\xc9\xd2\xd4\xd4\xda\xcb\xf9\xd3\xd0\xb5\xc4\xb2\xd9\xd7\xf7\xcf" +"\xb5\xcd\xb3\xd6\xd0\x0a\xd4\xcb\xd0\xd0\xa1\xa3\xd5\xe2\xd6\xd6" +"\xd3\xef\xd1\xd4\xbc\xf2\xb5\xa5\xb6\xf8\xc7\xbf\xb4\xf3\xa3\xac" +"\xca\xca\xba\xcf\xb8\xf7\xd6\xd6\xc8\xcb\xca\xbf\xd1\xa7\xcf\xb0" +"\xca\xb9\xd3\xc3\xa1\xa3\xc4\xbf\xc7\xb0\xa3\xac\xbb\xf9\xd3\xda" +"\xd5\xe2\x0a\xd6\xd6\xd3\xef\xd1\xd4\xb5\xc4\xcf\xe0\xb9\xd8\xbc" +"\xbc\xca\xf5\xd5\xfd\xd4\xda\xb7\xc9\xcb\xd9\xb5\xc4\xb7\xa2\xd5" +"\xb9\xa3\xac\xd3\xc3\xbb\xa7\xca\xfd\xc1\xbf\xbc\xb1\xbe\xe7\xc0" +"\xa9\xb4\xf3\xa3\xac\xcf\xe0\xb9\xd8\xb5\xc4\xd7\xca\xd4\xb4\xb7" +"\xc7\xb3\xa3\xb6\xe0\xa1\xa3\x0a", +"\xc2\xb7\xe2\x80\x94\xe2\x80\x96\xe2\x80\xbe\xc3\xbc\xef\xa1\xbf" +"\xc3\xbc\xc3\xbc\xc3\xbc\xef\xa1\xbf\xef\xbc\x9f\xef\xa1\xbe\xe3" +"\x80\x81\xe3\x80\x81\xef\xa1\xbe\x0a\x50\x79\x74\x68\x6f\x6e\xef" +"\xbc\x88\xe6\xb4\xbe\xe6\xa3\xae\xef\xbc\x89\xe8\xaf\xad\xe8\xa8" +"\x80\xe6\x98\xaf\xe4\xb8\x80\xe7\xa7\x8d\xe5\x8a\x9f\xe8\x83\xbd" +"\xe5\xbc\xba\xe5\xa4\xa7\xe8\x80\x8c\xe5\xae\x8c\xe5\x96\x84\xe7" +"\x9a\x84\xe9\x80\x9a\xe7\x94\xa8\xe5\x9e\x8b\xe8\xae\xa1\xe7\xae" +"\x97\xe6\x9c\xba\xe7\xa8\x8b\xe5\xba\x8f\xe8\xae\xbe\xe8\xae\xa1" +"\xe8\xaf\xad\xe8\xa8\x80\xef\xbc\x8c\x0a\xe5\xb7\xb2\xe7\xbb\x8f" +"\xe5\x85\xb7\xe6\x9c\x89\xe5\x8d\x81\xe5\xa4\x9a\xe5\xb9\xb4\xe7" +"\x9a\x84\xe5\x8f\x91\xe5\xb1\x95\xe5\x8e\x86\xe5\x8f\xb2\xef\xbc" +"\x8c\xe6\x88\x90\xe7\x86\x9f\xe4\xb8\x94\xe7\xa8\xb3\xe5\xae\x9a" +"\xe3\x80\x82\xe8\xbf\x99\xe7\xa7\x8d\xe8\xaf\xad\xe8\xa8\x80\xe5" +"\x85\xb7\xe6\x9c\x89\xe9\x9d\x9e\xe5\xb8\xb8\xe7\xae\x80\xe6\x8d" +"\xb7\xe8\x80\x8c\xe6\xb8\x85\xe6\x99\xb0\x0a\xe7\x9a\x84\xe8\xaf" +"\xad\xe6\xb3\x95\xe7\x89\xb9\xe7\x82\xb9\xef\xbc\x8c\xe9\x80\x82" +"\xe5\x90\x88\xe5\xae\x8c\xe6\x88\x90\xe5\x90\x84\xe7\xa7\x8d\xe9" +"\xab\x98\xe5\xb1\x82\xe4\xbb\xbb\xe5\x8a\xa1\xef\xbc\x8c\xe5\x87" +"\xa0\xe4\xb9\x8e\xe5\x8f\xaf\xe4\xbb\xa5\xe5\x9c\xa8\xe6\x89\x80" +"\xe6\x9c\x89\xe7\x9a\x84\xe6\x93\x8d\xe4\xbd\x9c\xe7\xb3\xbb\xe7" +"\xbb\x9f\xe4\xb8\xad\x0a\xe8\xbf\x90\xe8\xa1\x8c\xe3\x80\x82\xe8" +"\xbf\x99\xe7\xa7\x8d\xe8\xaf\xad\xe8\xa8\x80\xe7\xae\x80\xe5\x8d" +"\x95\xe8\x80\x8c\xe5\xbc\xba\xe5\xa4\xa7\xef\xbc\x8c\xe9\x80\x82" +"\xe5\x90\x88\xe5\x90\x84\xe7\xa7\x8d\xe4\xba\xba\xe5\xa3\xab\xe5" +"\xad\xa6\xe4\xb9\xa0\xe4\xbd\xbf\xe7\x94\xa8\xe3\x80\x82\xe7\x9b" +"\xae\xe5\x89\x8d\xef\xbc\x8c\xe5\x9f\xba\xe4\xba\x8e\xe8\xbf\x99" +"\x0a\xe7\xa7\x8d\xe8\xaf\xad\xe8\xa8\x80\xe7\x9a\x84\xe7\x9b\xb8" +"\xe5\x85\xb3\xe6\x8a\x80\xe6\x9c\xaf\xe6\xad\xa3\xe5\x9c\xa8\xe9" +"\xa3\x9e\xe9\x80\x9f\xe7\x9a\x84\xe5\x8f\x91\xe5\xb1\x95\xef\xbc" +"\x8c\xe7\x94\xa8\xe6\x88\xb7\xe6\x95\xb0\xe9\x87\x8f\xe6\x80\xa5" +"\xe5\x89\xa7\xe6\x89\xa9\xe5\xa4\xa7\xef\xbc\x8c\xe7\x9b\xb8\xe5" +"\x85\xb3\xe7\x9a\x84\xe8\xb5\x84\xe6\xba\x90\xe9\x9d\x9e\xe5\xb8" +"\xb8\xe5\xa4\x9a\xe3\x80\x82\x0a"), +'mac_chintrad': ( +"\xa1\x4e\xa1\x42\xa1\x50\xa1\x4f\xa1\x66\xa1\x66\xb8\x51\x0a\xa7" +"\xda\xad\xcc\xab\x4b\xb1\x60\xa7\xc6\xb1\xe6\xaf\xe0\xa7\x51\xa5" +"\xce\xa4\x40\xa8\xc7\xa4\x77\xb6\x7d\xb5\x6f\xa6\x6e\xaa\xba\x6c" +"\x69\x62\x72\x61\x72\x79\x2c\x20\xa8\xc3\xa6\xb3\xa4\x40\xad\xd3" +"\x20\x66\x61\x73\x74\x0a\x70\x72\x6f\x74\x6f\x74\x79\x70\x69\x6e" +"\x67\x20\xaa\xba\x20\x70\x72\x6f\x67\x72\x61\x6d\x6d\x69\x6e\x67" +"\x20\x6c\x61\x6e\x67\x75\x61\x67\x65\x20\xa5\x69\xa8\xd1\xa8\xcf" +"\xa5\xce\x2e\x20\xa5\xd8\xab\x65\xa6\xb3\xb3\x5c\xb3\x5c\xa6\x68" +"\xa6\x68\xaa\xba\x0a\x6c\x69\x62\x72\x61\x72\x79\x20\xac\x4f\xa5" +"\x48\x20\x43\x20\xbc\x67\xa6\xa8\x2c\x20\xa6\xd3\x20\x50\x79\x74" +"\x68\x6f\x6e\x20\xac\x4f\xa4\x40\xad\xd3\x20\x66\x61\x73\x74\x20" +"\x70\x72\x6f\x74\x6f\x74\x79\x70\x69\x6e\x67\x20\xaa\xba\x0a\x70" +"\x72\x6f\x67\x72\x61\x6d\x6d\x69\x6e\x67\x20\x6c\x61\x6e\x67\x75" +"\x61\x67\x65\x2e\x20\xac\x47\xa7\xda\xad\xcc\xa7\xc6\xb1\xe6\xaf" +"\xe0\xb1\x4e\xac\x4a\xa6\xb3\xaa\xba\x20\x43\x20\x6c\x69\x62\x72" +"\x61\x72\x79\x20\xae\xb3\xa8\xec\x0a\x50\x79\x74\x68\x6f\x6e\x20" +"\xaa\xba\xc0\xf4\xb9\xd2\xa4\xa4\xb4\xfa\xb8\xd5\xa4\xce\xbe\xe3" +"\xa6\x58\x2e\x20\xa8\xe4\xa4\xa4\xb3\xcc\xa5\x44\xad\x6e\xa4\x5d" +"\xac\x4f\xa7\xda\xad\xcc\xa9\xd2\xad\x6e\xb0\x51\xbd\xd7\xaa\xba" +"\xb0\xdd\xc3\x44\xb4\x4e\xac\x4f\x3a\x0a", +"\xe3\x80\x81\xef\xa1\xbd\xe3\x80\x81\xef\xbc\x8e\xef\xa1\xbe\xef" +"\xbc\x8e\xef\xa1\xbd\xe3\x80\x95\xe3\x80\x95\xe7\xa1\xbf\x0a\xe6" +"\x88\x91\xe5\x80\x91\xe4\xbe\xbf\xe5\xb8\xb8\xe5\xb8\x8c\xe6\x9c" +"\x9b\xe8\x83\xbd\xe5\x88\xa9\xe7\x94\xa8\xe4\xb8\x80\xe4\xba\x9b" +"\xe5\xb7\xb2\xe9\x96\x8b\xe7\x99\xbc\xe5\xa5\xbd\xe7\x9a\x84\x6c" +"\x69\x62\x72\x61\x72\x79\x2c\x20\xe4\xb8\xa6\xe6\x9c\x89\xe4\xb8" +"\x80\xe5\x80\x8b\x20\x66\x61\x73\x74\x0a\x70\x72\x6f\x74\x6f\x74" +"\x79\x70\x69\x6e\x67\x20\xe7\x9a\x84\x20\x70\x72\x6f\x67\x72\x61" +"\x6d\x6d\x69\x6e\x67\x20\x6c\x61\x6e\x67\x75\x61\x67\x65\x20\xe5" +"\x8f\xaf\xe4\xbe\x9b\xe4\xbd\xbf\xe7\x94\xa8\x2e\x20\xe7\x9b\xae" +"\xe5\x89\x8d\xe6\x9c\x89\xe8\xa8\xb1\xe8\xa8\xb1\xe5\xa4\x9a\xe5" +"\xa4\x9a\xe7\x9a\x84\x0a\x6c\x69\x62\x72\x61\x72\x79\x20\xe6\x98" +"\xaf\xe4\xbb\xa5\x20\x43\x20\xe5\xaf\xab\xe6\x88\x90\x2c\x20\xe8" +"\x80\x8c\x20\x50\x79\x74\x68\x6f\x6e\x20\xe6\x98\xaf\xe4\xb8\x80" +"\xe5\x80\x8b\x20\x66\x61\x73\x74\x20\x70\x72\x6f\x74\x6f\x74\x79" +"\x70\x69\x6e\x67\x20\xe7\x9a\x84\x0a\x70\x72\x6f\x67\x72\x61\x6d" +"\x6d\x69\x6e\x67\x20\x6c\x61\x6e\x67\x75\x61\x67\x65\x2e\x20\xe6" +"\x95\x85\xe6\x88\x91\xe5\x80\x91\xe5\xb8\x8c\xe6\x9c\x9b\xe8\x83" +"\xbd\xe5\xb0\x87\xe6\x97\xa2\xe6\x9c\x89\xe7\x9a\x84\x20\x43\x20" +"\x6c\x69\x62\x72\x61\x72\x79\x20\xe6\x8b\xbf\xe5\x88\xb0\x0a\x50" +"\x79\x74\x68\x6f\x6e\x20\xe7\x9a\x84\xe7\x92\xb0\xe5\xa2\x83\xe4" +"\xb8\xad\xe6\xb8\xac\xe8\xa9\xa6\xe5\x8f\x8a\xe6\x95\xb4\xe5\x90" +"\x88\x2e\x20\xe5\x85\xb6\xe4\xb8\xad\xe6\x9c\x80\xe4\xb8\xbb\xe8" +"\xa6\x81\xe4\xb9\x9f\xe6\x98\xaf\xe6\x88\x91\xe5\x80\x91\xe6\x89" +"\x80\xe8\xa6\x81\xe8\xa8\x8e\xe8\xab\x96\xe7\x9a\x84\xe5\x95\x8f" +"\xe9\xa1\x8c\xe5\xb0\xb1\xe6\x98\xaf\x3a\x0a"), +'mac_japanese': ( +"\x50\x79\x74\x68\x6f\x6e\x20\x82\xcc\x8a\x4a\x94\xad\x82\xcd\x81" +"\x41\x31\x39\x39\x30\x20\x94\x4e\x82\xb2\x82\xeb\x82\xa9\x82\xe7" +"\x8a\x4a\x8e\x6e\x82\xb3\x82\xea\x82\xc4\x82\xa2\x82\xdc\x82\xb7" +"\x81\x42\x0a\x8a\x4a\x94\xad\x8e\xd2\x82\xcc\x20\x47\x75\x69\x64" +"\x6f\x20\x76\x61\x6e\x20\x52\x6f\x73\x73\x75\x6d\x20\x82\xcd\x8b" +"\xb3\x88\xe7\x97\x70\x82\xcc\x83\x76\x83\x8d\x83\x4f\x83\x89\x83" +"\x7e\x83\x93\x83\x4f\x8c\xbe\x8c\xea\x81\x75\x41\x42\x43\x81\x76" +"\x82\xcc\x8a\x4a\x94\xad\x82\xc9\x8e\x51\x89\xc1\x82\xb5\x82\xc4" +"\x82\xa2\x82\xdc\x82\xb5\x20\x82\xbd\x82\xaa\x81\x41\x41\x42\x43" +"\x20\x82\xcd\x8e\xc0\x97\x70\x8f\xe3\x82\xcc\x96\xda\x93\x49\x82" +"\xc9\x82\xcd\x82\xa0\x82\xdc\x82\xe8\x93\x4b\x82\xb5\x82\xc4\x82" +"\xa2\x82\xdc\x82\xb9\x82\xf1\x82\xc5\x82\xb5\x82\xbd\x81\x42\x0a" +"\x82\xb1\x82\xcc\x82\xbd\x82\xdf\x81\x41\x47\x75\x69\x64\x6f\x20" +"\x82\xcd\x82\xe6\x82\xe8\x8e\xc0\x97\x70\x93\x49\x82\xc8\x83\x76" +"\x83\x8d\x83\x4f\x83\x89\x83\x7e\x83\x93\x83\x4f\x8c\xbe\x8c\xea" +"\x82\xcc\x8a\x4a\x94\xad\x82\xf0\x8a\x4a\x8e\x6e\x82\xb5\x81\x41" +"\x89\x70\x8d\x91\x20\x42\x42\x53\x20\x95\xfa\x91\x97\x82\xcc\x83" +"\x52\x83\x81\x20\x83\x66\x83\x42\x94\xd4\x91\x67\x81\x75\x83\x82" +"\x83\x93\x83\x65\x83\x42\x20\x83\x70\x83\x43\x83\x5c\x83\x93\x81" +"\x76\x82\xcc\x83\x74\x83\x40\x83\x93\x82\xc5\x82\xa0\x82\xe9\x20" +"\x47\x75\x69\x64\x6f\x20\x82\xcd\x82\xb1\x82\xcc\x8c\xbe\x8c\xea" +"\x82\xf0\x81\x75\x50\x79\x74\x68\x6f\x6e\x81\x76\x82\xc6\x96\xbc" +"\x82\xc3\x82\xaf\x82\xdc\x82\xb5\x82\xbd\x81\x42\x0a\x82\xb1\x82" +"\xcc\x82\xe6\x82\xa4\x82\xc8\x94\x77\x8c\x69\x82\xa9\x82\xe7\x90" +"\xb6\x82\xdc\x82\xea\x82\xbd\x20\x50\x79\x74\x68\x6f\x6e\x20\x82" +"\xcc\x8c\xbe\x8c\xea\x90\xdd\x8c\x76\x82\xcd\x81\x41\x81\x75\x83" +"\x56\x83\x93\x83\x76\x83\x8b\x81\x76\x82\xc5\x81\x75\x8f\x4b\x93" +"\xbe\x82\xaa\x97\x65\x88\xd5\x81\x76\x82\xc6\x82\xa2\x82\xa4\x96" +"\xda\x95\x57\x82\xc9\x8f\x64\x93\x5f\x82\xaa\x92\x75\x82\xa9\x82" +"\xea\x82\xc4\x82\xa2\x82\xdc\x82\xb7\x81\x42\x0a\xf0\x41\xfc\x40" +"\x87\x91\x7e\x81\x5c\x81\x5f\xa0\x86\x5d\x86\x9e\x46\x41\x58\x87" +"\xfc\x0a", +"\x50\x79\x74\x68\x6f\x6e\x20\xe3\x81\xae\xe9\x96\x8b\xe7\x99\xba" +"\xe3\x81\xaf\xe3\x80\x81\x31\x39\x39\x30\x20\xe5\xb9\xb4\xe3\x81" +"\x94\xe3\x82\x8d\xe3\x81\x8b\xe3\x82\x89\xe9\x96\x8b\xe5\xa7\x8b" +"\xe3\x81\x95\xe3\x82\x8c\xe3\x81\xa6\xe3\x81\x84\xe3\x81\xbe\xe3" +"\x81\x99\xe3\x80\x82\x0a\xe9\x96\x8b\xe7\x99\xba\xe8\x80\x85\xe3" +"\x81\xae\x20\x47\x75\x69\x64\x6f\x20\x76\x61\x6e\x20\x52\x6f\x73" +"\x73\x75\x6d\x20\xe3\x81\xaf\xe6\x95\x99\xe8\x82\xb2\xe7\x94\xa8" +"\xe3\x81\xae\xe3\x83\x97\xe3\x83\xad\xe3\x82\xb0\xe3\x83\xa9\xe3" +"\x83\x9f\xe3\x83\xb3\xe3\x82\xb0\xe8\xa8\x80\xe8\xaa\x9e\xe3\x80" +"\x8c\x41\x42\x43\xe3\x80\x8d\xe3\x81\xae\xe9\x96\x8b\xe7\x99\xba" +"\xe3\x81\xab\xe5\x8f\x82\xe5\x8a\xa0\xe3\x81\x97\xe3\x81\xa6\xe3" +"\x81\x84\xe3\x81\xbe\xe3\x81\x97\x20\xe3\x81\x9f\xe3\x81\x8c\xe3" +"\x80\x81\x41\x42\x43\x20\xe3\x81\xaf\xe5\xae\x9f\xe7\x94\xa8\xe4" +"\xb8\x8a\xe3\x81\xae\xe7\x9b\xae\xe7\x9a\x84\xe3\x81\xab\xe3\x81" +"\xaf\xe3\x81\x82\xe3\x81\xbe\xe3\x82\x8a\xe9\x81\xa9\xe3\x81\x97" +"\xe3\x81\xa6\xe3\x81\x84\xe3\x81\xbe\xe3\x81\x9b\xe3\x82\x93\xe3" +"\x81\xa7\xe3\x81\x97\xe3\x81\x9f\xe3\x80\x82\x0a\xe3\x81\x93\xe3" +"\x81\xae\xe3\x81\x9f\xe3\x82\x81\xe3\x80\x81\x47\x75\x69\x64\x6f" +"\x20\xe3\x81\xaf\xe3\x82\x88\xe3\x82\x8a\xe5\xae\x9f\xe7\x94\xa8" +"\xe7\x9a\x84\xe3\x81\xaa\xe3\x83\x97\xe3\x83\xad\xe3\x82\xb0\xe3" +"\x83\xa9\xe3\x83\x9f\xe3\x83\xb3\xe3\x82\xb0\xe8\xa8\x80\xe8\xaa" +"\x9e\xe3\x81\xae\xe9\x96\x8b\xe7\x99\xba\xe3\x82\x92\xe9\x96\x8b" +"\xe5\xa7\x8b\xe3\x81\x97\xe3\x80\x81\xe8\x8b\xb1\xe5\x9b\xbd\x20" +"\x42\x42\x53\x20\xe6\x94\xbe\xe9\x80\x81\xe3\x81\xae\xe3\x82\xb3" +"\xe3\x83\xa1\x20\xe3\x83\x87\xe3\x82\xa3\xe7\x95\xaa\xe7\xb5\x84" +"\xe3\x80\x8c\xe3\x83\xa2\xe3\x83\xb3\xe3\x83\x86\xe3\x82\xa3\x20" +"\xe3\x83\x91\xe3\x82\xa4\xe3\x82\xbd\xe3\x83\xb3\xe3\x80\x8d\xe3" +"\x81\xae\xe3\x83\x95\xe3\x82\xa1\xe3\x83\xb3\xe3\x81\xa7\xe3\x81" +"\x82\xe3\x82\x8b\x20\x47\x75\x69\x64\x6f\x20\xe3\x81\xaf\xe3\x81" +"\x93\xe3\x81\xae\xe8\xa8\x80\xe8\xaa\x9e\xe3\x82\x92\xe3\x80\x8c" +"\x50\x79\x74\x68\x6f\x6e\xe3\x80\x8d\xe3\x81\xa8\xe5\x90\x8d\xe3" +"\x81\xa5\xe3\x81\x91\xe3\x81\xbe\xe3\x81\x97\xe3\x81\x9f\xe3\x80" +"\x82\x0a\xe3\x81\x93\xe3\x81\xae\xe3\x82\x88\xe3\x81\x86\xe3\x81" +"\xaa\xe8\x83\x8c\xe6\x99\xaf\xe3\x81\x8b\xe3\x82\x89\xe7\x94\x9f" +"\xe3\x81\xbe\xe3\x82\x8c\xe3\x81\x9f\x20\x50\x79\x74\x68\x6f\x6e" +"\x20\xe3\x81\xae\xe8\xa8\x80\xe8\xaa\x9e\xe8\xa8\xad\xe8\xa8\x88" +"\xe3\x81\xaf\xe3\x80\x81\xe3\x80\x8c\xe3\x82\xb7\xe3\x83\xb3\xe3" +"\x83\x97\xe3\x83\xab\xe3\x80\x8d\xe3\x81\xa7\xe3\x80\x8c\xe7\xbf" +"\x92\xe5\xbe\x97\xe3\x81\x8c\xe5\xae\xb9\xe6\x98\x93\xe3\x80\x8d" +"\xe3\x81\xa8\xe3\x81\x84\xe3\x81\x86\xe7\x9b\xae\xe6\xa8\x99\xe3" +"\x81\xab\xe9\x87\x8d\xe7\x82\xb9\xe3\x81\x8c\xe7\xbd\xae\xe3\x81" +"\x8b\xe3\x82\x8c\xe3\x81\xa6\xe3\x81\x84\xe3\x81\xbe\xe3\x81\x99" +"\xe3\x80\x82\x0a\xee\x80\x81\xee\xa3\x90\xe5\xa4\xa7\xe2\x83\x9d" +"\x7e\xe2\x80\x94\xef\xbc\xbc\xc2\xa0\xef\xa1\xa0\x54\x42\xef\xa1" +"\xa1\x46\x41\x58\x46\x41\x58\xef\xa1\xa2\xe8\xb2\xa1\xe5\x9b\xa3" +"\xe6\xb3\x95\xe4\xba\xba\x0a"), +'mac_korean': ( +"\xa1\xdd\x20\xc6\xc4\xc0\xcc\xbd\xe3\x28\x50\x79\x74\x68\x6f\x6e" +"\x29\xc0\xba\x20\xb9\xe8\xbf\xec\xb1\xe2\x20\xbd\xb1\xb0\xed\x2c" +"\x20\xb0\xad\xb7\xc2\xc7\xd1\x20\xc7\xc1\xb7\xce\xb1\xd7\xb7\xa1" +"\xb9\xd6\x20\xbe\xf0\xbe\xee\xc0\xd4\xb4\xcf\xb4\xd9\x2e\x20\xc6" +"\xc4\xc0\xcc\xbd\xe3\xc0\xba\x0a\xc8\xbf\xc0\xb2\xc0\xfb\xc0\xce" +"\x20\xb0\xed\xbc\xf6\xc1\xd8\x20\xb5\xa5\xc0\xcc\xc5\xcd\x20\xb1" +"\xb8\xc1\xb6\xbf\xcd\x20\xb0\xa3\xb4\xdc\xc7\xcf\xc1\xf6\xb8\xb8" +"\x20\xc8\xbf\xc0\xb2\xc0\xfb\xc0\xce\x20\xb0\xb4\xc3\xbc\xc1\xf6" +"\xc7\xe2\xc7\xc1\xb7\xce\xb1\xd7\xb7\xa1\xb9\xd6\xc0\xbb\x0a\xc1" +"\xf6\xbf\xf8\xc7\xd5\xb4\xcf\xb4\xd9\x2e\x20\xc6\xc4\xc0\xcc\xbd" +"\xe3\xc0\xc7\x20\xbf\xec\xbe\xc6\x28\xe9\xd0\xe4\xba\x29\xc7\xd1" +"\x20\xb9\xae\xb9\xfd\xb0\xfa\x20\xb5\xbf\xc0\xfb\x20\xc5\xb8\xc0" +"\xcc\xc7\xce\x2c\x20\xb1\xd7\xb8\xae\xb0\xed\x20\xc0\xce\xc5\xcd" +"\xc7\xc1\xb8\xae\xc6\xc3\x0a\xc8\xaf\xb0\xe6\xc0\xba\x20\xc6\xc4" +"\xc0\xcc\xbd\xe3\xc0\xbb\x20\xbd\xba\xc5\xa9\xb8\xb3\xc6\xc3\xb0" +"\xfa\x20\xbf\xa9\xb7\xaf\x20\xba\xd0\xbe\xdf\xbf\xa1\xbc\xad\xbf" +"\xcd\x20\xb4\xeb\xba\xce\xba\xd0\xc0\xc7\x20\xc7\xc3\xb7\xa7\xc6" +"\xfb\xbf\xa1\xbc\xad\xc0\xc7\x20\xba\xfc\xb8\xa5\x0a\xbe\xd6\xc7" +"\xc3\xb8\xae\xc4\xc9\xc0\xcc\xbc\xc7\x20\xb0\xb3\xb9\xdf\xc0\xbb" +"\x20\xc7\xd2\x20\xbc\xf6\x20\xc0\xd6\xb4\xc2\x20\xc0\xcc\xbb\xf3" +"\xc0\xfb\xc0\xce\x20\xbe\xf0\xbe\xee\xb7\xce\x20\xb8\xb8\xb5\xe9" +"\xbe\xee\xc1\xdd\xb4\xcf\xb4\xd9\x2e\x0a\xa1\xcb\xa1\xcc\xa3\xfe" +"\x9a\xa1\x4b\xa1\xb4\xbc\xf6\x20\xa2\xe8\xc1\xa4\xa2\xf0\x5d\x31" +"\xa3\x91\xaa\x50\x0a", +"\xe2\x97\x8e\x20\xed\x8c\x8c\xec\x9d\xb4\xec\x8d\xac\x28\x50\x79" +"\x74\x68\x6f\x6e\x29\xec\x9d\x80\x20\xeb\xb0\xb0\xec\x9a\xb0\xea" +"\xb8\xb0\x20\xec\x89\xbd\xea\xb3\xa0\x2c\x20\xea\xb0\x95\xeb\xa0" +"\xa5\xed\x95\x9c\x20\xed\x94\x84\xeb\xa1\x9c\xea\xb7\xb8\xeb\x9e" +"\x98\xeb\xb0\x8d\x20\xec\x96\xb8\xec\x96\xb4\xec\x9e\x85\xeb\x8b" +"\x88\xeb\x8b\xa4\x2e\x20\xed\x8c\x8c\xec\x9d\xb4\xec\x8d\xac\xec" +"\x9d\x80\x0a\xed\x9a\xa8\xec\x9c\xa8\xec\xa0\x81\xec\x9d\xb8\x20" +"\xea\xb3\xa0\xec\x88\x98\xec\xa4\x80\x20\xeb\x8d\xb0\xec\x9d\xb4" +"\xed\x84\xb0\x20\xea\xb5\xac\xec\xa1\xb0\xec\x99\x80\x20\xea\xb0" +"\x84\xeb\x8b\xa8\xed\x95\x98\xec\xa7\x80\xeb\xa7\x8c\x20\xed\x9a" +"\xa8\xec\x9c\xa8\xec\xa0\x81\xec\x9d\xb8\x20\xea\xb0\x9d\xec\xb2" +"\xb4\xec\xa7\x80\xed\x96\xa5\xed\x94\x84\xeb\xa1\x9c\xea\xb7\xb8" +"\xeb\x9e\x98\xeb\xb0\x8d\xec\x9d\x84\x0a\xec\xa7\x80\xec\x9b\x90" +"\xed\x95\xa9\xeb\x8b\x88\xeb\x8b\xa4\x2e\x20\xed\x8c\x8c\xec\x9d" +"\xb4\xec\x8d\xac\xec\x9d\x98\x20\xec\x9a\xb0\xec\x95\x84\x28\xe5" +"\x84\xaa\xe9\x9b\x85\x29\xed\x95\x9c\x20\xeb\xac\xb8\xeb\xb2\x95" +"\xea\xb3\xbc\x20\xeb\x8f\x99\xec\xa0\x81\x20\xed\x83\x80\xec\x9d" +"\xb4\xed\x95\x91\x2c\x20\xea\xb7\xb8\xeb\xa6\xac\xea\xb3\xa0\x20" +"\xec\x9d\xb8\xed\x84\xb0\xed\x94\x84\xeb\xa6\xac\xed\x8c\x85\x0a" +"\xed\x99\x98\xea\xb2\xbd\xec\x9d\x80\x20\xed\x8c\x8c\xec\x9d\xb4" +"\xec\x8d\xac\xec\x9d\x84\x20\xec\x8a\xa4\xed\x81\xac\xeb\xa6\xbd" +"\xed\x8c\x85\xea\xb3\xbc\x20\xec\x97\xac\xeb\x9f\xac\x20\xeb\xb6" +"\x84\xec\x95\xbc\xec\x97\x90\xec\x84\x9c\xec\x99\x80\x20\xeb\x8c" +"\x80\xeb\xb6\x80\xeb\xb6\x84\xec\x9d\x98\x20\xed\x94\x8c\xeb\x9e" +"\xab\xed\x8f\xbc\xec\x97\x90\xec\x84\x9c\xec\x9d\x98\x20\xeb\xb9" +"\xa0\xeb\xa5\xb8\x0a\xec\x95\xa0\xed\x94\x8c\xeb\xa6\xac\xec\xbc" +"\x80\xec\x9d\xb4\xec\x85\x98\x20\xea\xb0\x9c\xeb\xb0\x9c\xec\x9d" +"\x84\x20\xed\x95\xa0\x20\xec\x88\x98\x20\xec\x9e\x88\xeb\x8a\x94" +"\x20\xec\x9d\xb4\xec\x83\x81\xec\xa0\x81\xec\x9d\xb8\x20\xec\x96" +"\xb8\xec\x96\xb4\xeb\xa1\x9c\x20\xeb\xa7\x8c\xeb\x93\xa4\xec\x96" +"\xb4\xec\xa4\x8d\xeb\x8b\x88\xeb\x8b\xa4\x2e\x0a\xc2\xa2\xc2\xa3" +"\xe2\x80\xbe\xc2\x9a\xe3\x80\x88\xef\xa1\xb8\xe3\x80\x88\xec\x88" +"\x98\x20\x33\xe2\x83\x9e\xef\xa1\xbc\xec\xa0\x95\xef\xa1\xa3\x5b" +"\x31\x31\x5d\x5d\x31\xe2\x93\x81\xea\xb0\x90\xe2\x83\x9e\x0a"), 'shift_jis': ( "\x50\x79\x74\x68\x6f\x6e\x20\x82\xcc\x8a\x4a\x94\xad\x82\xcd\x81" "\x41\x31\x39\x39\x30\x20\x94\x4e\x82\xb2\x82\xeb\x82\xa9\x82\xe7" Index: Lib/test/test_codecencodings_jp.py =================================================================== --- Lib/test/test_codecencodings_jp.py (revision 64531) +++ Lib/test/test_codecencodings_jp.py (working copy) @@ -98,6 +98,19 @@ "\x85Gℜ\x85Q = ⟨ሴ⟩" ) +class Test_MacJapanese(test_multibytecodec_support.TestBase, + unittest.TestCase): + encoding = 'mac_japanese' + tstring = test_multibytecodec_support.load_teststring('mac_japanese') + codectests = ( + # invalid codepoints + ("abc\x81\xec\x81\xec\x82\x84", "strict", None), + ("abc\xf8", "strict", None), + ("abc\x81\xec\x82\x84", "replace", u"abc\ufffd\uff44"), + ("abc\x81\xec\x82\x84\x88", "replace", u"abc\ufffd\uff44\ufffd"), + ("abc\x81\xec\x81\xec\x82\x84def", "ignore", u"abc\uff44def"), + ) + def test_main(): test_support.run_unittest(__name__) Index: Lib/test/test_multibytecodec_support.py =================================================================== --- Lib/test/test_multibytecodec_support.py (revision 64531) +++ Lib/test/test_multibytecodec_support.py (working copy) @@ -303,7 +303,7 @@ continue unich = unichrs(data[1]) - if ord(unich) == 0xfffd or urt_wa.has_key(unich): + if unich == u'\ufffd' or unich in urt_wa: continue urt_wa[unich] = csetch Index: Modules/cjkcodecs/_codecs_tw.c =================================================================== --- Modules/cjkcodecs/_codecs_tw.c (revision 64531) +++ Modules/cjkcodecs/_codecs_tw.c (working copy) @@ -125,8 +125,8 @@ END_MAPPINGS_LIST BEGIN_CODECS_LIST - CODEC_STATELESS(big5) - CODEC_STATELESS(cp950) + CODEC_STATELESS(big5, 1, 2) + CODEC_STATELESS(cp950, 1, 2) END_CODECS_LIST I_AM_A_MODULE_FOR(tw) Index: Modules/cjkcodecs/multibytecodec.c =================================================================== --- Modules/cjkcodecs/multibytecodec.c (revision 64531) +++ Modules/cjkcodecs/multibytecodec.c (working copy) @@ -676,6 +676,9 @@ static void multibytecodec_dealloc(MultibyteCodecObject *self) { + if (self->dataref != NULL) { + Py_DECREF(self->dataref); + } PyObject_Del(self); } @@ -716,11 +719,24 @@ * Utility functions for stateful codec mechanism */ -#define STATEFUL_DCTX(o) ((MultibyteStatefulDecoderContext *)(o)) -#define STATEFUL_ECTX(o) ((MultibyteStatefulEncoderContext *)(o)) +#define STATEFUL_DCTX(o) ((MultibyteStatefulDecoder *)(o)) +#define STATEFUL_ECTX(o) ((MultibyteStatefulEncoder *)(o)) static PyObject * -encoder_encode_stateful(MultibyteStatefulEncoderContext *ctx, +allocate_variable_codec(PyTypeObject *type, PyObject *codec, int enc) +{ + MultibyteCodecObject *c = (MultibyteCodecObject *)codec; + Py_ssize_t size; + PyObject *r; + + size = enc ? c->codec->encbufsize : c->codec->decbufsize; + r = type->tp_alloc(type, size - 1); /* pendings don't need sentinel */ + Py_SIZE(r) = size; /* fix up */ + return r; +} + +static PyObject * +encoder_encode_stateful(MultibyteStatefulEncoder *ctx, PyObject *unistr, int final) { PyObject *ucvt, *r = NULL; @@ -781,7 +797,7 @@ if (inbuf < inbuf_end) { ctx->pendingsize = (Py_ssize_t)(inbuf_end - inbuf); - if (ctx->pendingsize > MAXENCPENDING) { + if (ctx->pendingsize > Py_SIZE(ctx)) { /* normal codecs can't reach here */ ctx->pendingsize = 0; PyErr_SetString(PyExc_UnicodeError, @@ -806,16 +822,16 @@ } static int -decoder_append_pending(MultibyteStatefulDecoderContext *ctx, +decoder_append_pending(MultibyteStatefulDecoder *ctx, MultibyteDecodeBuffer *buf) { Py_ssize_t npendings; npendings = (Py_ssize_t)(buf->inbuf_end - buf->inbuf); - if (npendings + ctx->pendingsize > MAXDECPENDING || - npendings > PY_SSIZE_T_MAX - ctx->pendingsize) { - PyErr_SetString(PyExc_UnicodeError, "pending buffer overflow"); - return -1; + if (npendings + ctx->pendingsize > Py_SIZE(ctx) || + npendings > PY_SSIZE_T_MAX - ctx->pendingsize) { + PyErr_SetString(PyExc_UnicodeError, "pending buffer overflow"); + return -1; } memcpy(ctx->pending + ctx->pendingsize, buf->inbuf, npendings); ctx->pendingsize += npendings; @@ -841,7 +857,7 @@ } static int -decoder_feed_buffer(MultibyteStatefulDecoderContext *ctx, +decoder_feed_buffer(MultibyteStatefulDecoder *ctx, MultibyteDecodeBuffer *buf) { while (buf->inbuf < buf->inbuf_end) { @@ -911,18 +927,19 @@ incnewkwarglist, &errors)) return NULL; - self = (MultibyteIncrementalEncoderObject *)type->tp_alloc(type, 0); - if (self == NULL) - return NULL; - codec = PyObject_GetAttrString((PyObject *)type, "codec"); if (codec == NULL) - goto errorexit; + return NULL; if (!MultibyteCodec_Check(codec)) { PyErr_SetString(PyExc_TypeError, "codec is unexpected type"); - goto errorexit; + return NULL; } + self = (MultibyteIncrementalEncoderObject *) + allocate_variable_codec(type, codec, 1); + if (self == NULL) + goto errorexit; + self->codec = ((MultibyteCodecObject *)codec)->codec; self->pendingsize = 0; self->errors = internal_error_callback(errors); @@ -967,8 +984,9 @@ static PyTypeObject MultibyteIncrementalEncoder_Type = { PyVarObject_HEAD_INIT(NULL, 0) "MultibyteIncrementalEncoder", /* tp_name */ - sizeof(MultibyteIncrementalEncoderObject), /* tp_basicsize */ - 0, /* tp_itemsize */ + sizeof(MultibyteIncrementalEncoderObject) - sizeof(Py_UNICODE), + /* tp_basicsize */ + sizeof(Py_UNICODE), /* tp_itemsize */ /* methods */ (destructor)mbiencoder_dealloc, /* tp_dealloc */ 0, /* tp_print */ @@ -1115,18 +1133,19 @@ incnewkwarglist, &errors)) return NULL; - self = (MultibyteIncrementalDecoderObject *)type->tp_alloc(type, 0); - if (self == NULL) - return NULL; - codec = PyObject_GetAttrString((PyObject *)type, "codec"); if (codec == NULL) - goto errorexit; + return NULL; if (!MultibyteCodec_Check(codec)) { PyErr_SetString(PyExc_TypeError, "codec is unexpected type"); - goto errorexit; + return NULL; } + self = (MultibyteIncrementalDecoderObject *) + allocate_variable_codec(type, codec, 0); + if (self == NULL) + goto errorexit; + self->codec = ((MultibyteCodecObject *)codec)->codec; self->pendingsize = 0; self->errors = internal_error_callback(errors); @@ -1171,8 +1190,9 @@ static PyTypeObject MultibyteIncrementalDecoder_Type = { PyVarObject_HEAD_INIT(NULL, 0) "MultibyteIncrementalDecoder", /* tp_name */ - sizeof(MultibyteIncrementalDecoderObject), /* tp_basicsize */ - 0, /* tp_itemsize */ + sizeof(MultibyteIncrementalDecoderObject) - sizeof(unsigned char), + /* tp_basicsize */ + sizeof(unsigned char), /* tp_itemsize */ /* methods */ (destructor)mbidecoder_dealloc, /* tp_dealloc */ 0, /* tp_print */ @@ -1279,7 +1299,7 @@ goto errorexit; if (rsize > 0 && decoder_feed_buffer( - (MultibyteStatefulDecoderContext *)self, &buf)) + (MultibyteStatefulDecoder *)self, &buf)) goto errorexit; if (endoffile || sizehint < 0) { @@ -1431,18 +1451,19 @@ streamkwarglist, &stream, &errors)) return NULL; - self = (MultibyteStreamReaderObject *)type->tp_alloc(type, 0); - if (self == NULL) - return NULL; - codec = PyObject_GetAttrString((PyObject *)type, "codec"); if (codec == NULL) - goto errorexit; + return NULL; if (!MultibyteCodec_Check(codec)) { PyErr_SetString(PyExc_TypeError, "codec is unexpected type"); - goto errorexit; + return NULL; } + self = (MultibyteStreamReaderObject *) + allocate_variable_codec(type, codec, 0); + if (self == NULL) + goto errorexit; + self->codec = ((MultibyteCodecObject *)codec)->codec; self->stream = stream; Py_INCREF(stream); @@ -1491,8 +1512,9 @@ static PyTypeObject MultibyteStreamReader_Type = { PyVarObject_HEAD_INIT(NULL, 0) "MultibyteStreamReader", /* tp_name */ - sizeof(MultibyteStreamReaderObject), /* tp_basicsize */ - 0, /* tp_itemsize */ + sizeof(MultibyteStreamReaderObject) - sizeof(unsigned char), + /* tp_basicsize */ + sizeof(unsigned char), /* tp_itemsize */ /* methods */ (destructor)mbstreamreader_dealloc, /* tp_dealloc */ 0, /* tp_print */ @@ -1633,18 +1655,19 @@ streamkwarglist, &stream, &errors)) return NULL; - self = (MultibyteStreamWriterObject *)type->tp_alloc(type, 0); - if (self == NULL) - return NULL; - codec = PyObject_GetAttrString((PyObject *)type, "codec"); if (codec == NULL) - goto errorexit; + return NULL; if (!MultibyteCodec_Check(codec)) { PyErr_SetString(PyExc_TypeError, "codec is unexpected type"); - goto errorexit; + return NULL; } + self = (MultibyteStreamWriterObject *) + allocate_variable_codec(type, codec, 1); + if (self == NULL) + goto errorexit; + self->codec = ((MultibyteCodecObject *)codec)->codec; self->stream = stream; Py_INCREF(stream); @@ -1710,8 +1733,9 @@ static PyTypeObject MultibyteStreamWriter_Type = { PyVarObject_HEAD_INIT(NULL, 0) "MultibyteStreamWriter", /* tp_name */ - sizeof(MultibyteStreamWriterObject), /* tp_basicsize */ - 0, /* tp_itemsize */ + sizeof(MultibyteStreamWriterObject) - sizeof(Py_UNICODE), + /* tp_basicsize */ + sizeof(Py_UNICODE), /* tp_itemsize */ /* methods */ (destructor)mbstreamwriter_dealloc, /* tp_dealloc */ 0, /* tp_print */ @@ -1750,7 +1774,6 @@ mbstreamwriter_new, /* tp_new */ }; - /** * Exposed factory function */ @@ -1774,12 +1797,419 @@ if (self == NULL) return NULL; self->codec = codec; + self->dataref = arg; + Py_INCREF(arg); return (PyObject *)self; } +/** + * Dictionary-driven codec extension adaptor + */ + +struct extcodec_config { + PyObject *encovermap; /* dictionary for encoding mapping */ + PyObject *decovermap; /* dictionary for decoding mapping */ + MultibyteCodec *basecodec; /* codec which will be overridden */ + PyObject *dataref; /* object reference to basecodec */ + Py_ssize_t encbufsize; /* maximum buffer size for encoding */ + Py_ssize_t decbufsize; /* maximum buffer size for decoding */ + void *baseconfig; /* configuration flag for basecodec */ +}; + +static int +extcodec_init(const void *config) +{ + /* init is already called when the extension wrapper is created. */ + return 0; +} + +static Py_ssize_t +extcodec_encode(MultibyteCodec_State *state, + const void *config, + const Py_UNICODE **inbuf, Py_ssize_t inleft, + unsigned char **outbuf, Py_ssize_t outleft, + int flags) +{ + const struct extcodec_config *cfg; + Py_ssize_t winsize; + + cfg = (const struct extcodec_config *)config; + + while (inleft > 0) { + Py_ssize_t written = -1, winputsize; + + for (winsize = 1;;) { + PyObject *lookup, *found; + Py_ssize_t nextwinsize; + + if (inleft < winsize) { + if (written >= 0 && + (flags & MBENC_FLUSH)) { + winsize = 0; + break; + } + else + return MBERR_TOOFEW; + } + + lookup = PyUnicode_FromUnicode(*inbuf, winsize); + if (lookup == NULL) + return MBERR_INTERNAL; + + found = PyDict_GetItem(cfg->encovermap, lookup); + Py_DECREF(lookup); + if (found == NULL) { + /* if already have a match for shorter input, + * avoid delegation to the base codec. */ + if (written >= 0) + winsize = 0; + break; + } + else if (found == Py_None) /* invalid sequence */ + return winsize; + else if (PyString_Check(found)) {/* found in overmap */ + if (outleft < PyString_GET_SIZE(found)) + return MBERR_TOOSMALL; + + memcpy(*outbuf, PyString_AS_STRING(found), + PyString_GET_SIZE(found)); + written = PyString_GET_SIZE(found); + winputsize = winsize; + winsize = 0; + break; + } + else if (PyInt_Check(found)) /* set window size */ + nextwinsize = PyInt_AS_LONG(found); + else if (PyTuple_Check(found) && + PyTuple_GET_SIZE(found) == 2 && + PyInt_Check(PyTuple_GET_ITEM(found, 0)) && + PyString_Check(PyTuple_GET_ITEM(found, 1))) { + /* set window size and write shorter candidate + * sequence in outbuf. It will be overwritten + * if longer match is found in overmap, or + * survive otherwise. */ + PyObject *candidate; + + candidate = PyTuple_GET_ITEM(found, 1); + written = PyString_GET_SIZE(candidate); + winputsize = winsize; + + if (outleft < written) + return MBERR_TOOSMALL; + memcpy(*outbuf, PyString_AS_STRING(candidate), + written); + + nextwinsize = PyInt_AS_LONG( + PyTuple_GET_ITEM(found, 0)); + } + else + return MBERR_INTERNAL; + + /* window size must grow in order not to fall into an + * infinite loop. */ + if (nextwinsize <= winsize || + nextwinsize > cfg->encbufsize) + return MBERR_INTERNAL; + + winsize = nextwinsize; + } + + if (winsize > 0) { /* delegate to process a letter */ + const Py_UNICODE *inpos; + const unsigned char *outpos; + int dflags; + + dflags &= ~MBENC_FLUSH; + for (inpos = *inbuf, outpos = *outbuf;;) { + Py_ssize_t r; + + r = cfg->basecodec->encode(state, + cfg->baseconfig, inbuf, + winsize > inleft ? inleft : winsize, + outbuf, outleft, dflags); + inleft -= (Py_ssize_t)(*inbuf - inpos); + outleft -= (Py_ssize_t)(*outbuf - outpos); + if (r == 0) + break; + + if (r == MBERR_TOOFEW) { + if (winsize < inleft && + winsize <= cfg->decbufsize) + winsize++; + else if (!(dflags & MBENC_FLUSH) && + (flags & MBENC_FLUSH)) + dflags |= MBENC_FLUSH; + else + return MBERR_TOOFEW; + } + else + return r; + } + } + else if (written >= 0) { /* processed by overmap */ + (*outbuf) += written; + outleft -= written; + (*inbuf) += winputsize; + inleft -= winputsize; + } + } + + return 0; +} + +static int +extcodec_encinit(MultibyteCodec_State *state, const void *config) +{ + const struct extcodec_config *cfg; + + cfg = (const struct extcodec_config *)config; + + if (cfg->basecodec->encinit != NULL) + return cfg->basecodec->encinit(state, cfg->baseconfig); + else + return 0; +} + +static Py_ssize_t +extcodec_encreset(MultibyteCodec_State *state, + const void *config, + unsigned char **outbuf, Py_ssize_t outleft) +{ + const struct extcodec_config *cfg; + + cfg = (const struct extcodec_config *)config; + + if (cfg->basecodec->encreset != NULL) + return cfg->basecodec->encreset(state, cfg->baseconfig, + outbuf, outleft); + else + return 0; +} + +static Py_ssize_t +extcodec_decode(MultibyteCodec_State *state, + const void *config, + const unsigned char **inbuf, Py_ssize_t inleft, + Py_UNICODE **outbuf, Py_ssize_t outleft) +{ + const struct extcodec_config *cfg; + Py_ssize_t winsize; + + cfg = (const struct extcodec_config *)config; + + while (inleft > 0) { + for (winsize = 1;;) { + PyObject *lookup, *found; + Py_UNICODE *decoded; + Py_ssize_t i; + + if (inleft < winsize) + return MBERR_TOOFEW; + + lookup = PyString_FromStringAndSize( + (const char *)*inbuf, winsize); + if (lookup == NULL) + return MBERR_INTERNAL; + + found = PyDict_GetItem(cfg->decovermap, lookup); + Py_DECREF(lookup); + if (found == Py_None) /* invalid sequence */ + return winsize; + else if (found == NULL) /* delegate */ + break; + else if (PyInt_Check(found)) { /* set window size */ + Py_ssize_t nextwinsize; + + nextwinsize = PyInt_AS_LONG(found); + if (nextwinsize <= winsize || + nextwinsize > cfg->decbufsize) + return MBERR_INTERNAL; + + winsize = nextwinsize; + continue; + } + else if (!PyUnicode_Check(found)) + return MBERR_INTERNAL; + + /* found in overmap */ + if (outleft < PyUnicode_GET_SIZE(found)) + return MBERR_TOOSMALL; + + decoded = PyUnicode_AS_UNICODE(found); + for (i = PyUnicode_GET_SIZE(found); i > 0; i--) + *(*outbuf)++ = *decoded++; + + (*inbuf) += winsize; + inleft -= winsize; + outleft -= PyUnicode_GET_SIZE(found); + winsize = 0; + break; + } + + if (winsize > 0) { /* delegate to process a letter */ + const unsigned char *inpos; + const Py_UNICODE *outpos; + Py_ssize_t r; + + for (inpos = *inbuf, outpos = *outbuf;;) { + r = cfg->basecodec->decode(state, + cfg->baseconfig, inbuf, + winsize > inleft ? inleft : winsize, + outbuf, outleft); + inleft -= (Py_ssize_t)(*inbuf - inpos); + outleft -= (Py_ssize_t)(*outbuf - outpos); + + if (r == 0) + break; + + if (r == MBERR_TOOFEW && winsize < inleft && + winsize <= cfg->decbufsize) + winsize++; + else + return r; + } + } + } + + return 0; +} + +static int +extcodec_decinit(MultibyteCodec_State *state, const void *config) +{ + const struct extcodec_config *cfg; + + cfg = (const struct extcodec_config *)config; + + if (cfg->basecodec->decinit != NULL) + return cfg->basecodec->decinit(state, cfg->baseconfig); + else + return 0; +} + +static Py_ssize_t +extcodec_decreset(MultibyteCodec_State *state, const void *config) +{ + const struct extcodec_config *cfg; + + cfg = (const struct extcodec_config *)config; + + if (cfg->basecodec->decreset != NULL) + return cfg->basecodec->decreset(state, cfg->baseconfig); + else + return 0; +} + +static const MultibyteCodec extcodec_template = { + NULL, /* encoding */ + NULL, /* config */ + extcodec_init, /* codecinit */ + extcodec_encode, /* encode */ + extcodec_encinit, /* encinit */ + extcodec_encreset, /* encreset */ + 0, /* encbufsize */ + extcodec_decode, /* decode */ + extcodec_decinit, /* decinit */ + extcodec_decreset, /* decreset */ + 0, /* decbufsize */ +}; + +static void +extcodec_dealloc(void *codec) +{ + struct extcodec_config *config; + + if (((MultibyteCodec *)codec)->encoding != NULL) + PyMem_Del((void *)((MultibyteCodec *)codec)->encoding); + + config = (struct extcodec_config *)((MultibyteCodec *)codec)->config; + Py_DECREF(config->encovermap); + Py_DECREF(config->decovermap); + Py_DECREF(config->dataref); + PyMem_Del(config); + + PyMem_Del(codec); +} + +static PyObject * +create_extcodec(PyObject *self, PyObject *args) +{ + PyObject *encovermap, *decovermap, *basecodec, *extcodec_cobj; + PyObject *r; + MultibyteCodec *codec, *extcodec; + Py_ssize_t encbufsize, decbufsize, encnamelen; + char *encname; + int flags; + struct extcodec_config *newconfig; + + if (!PyArg_ParseTuple(args, "s#OOOnni:create_extcodec", + &encname, &encnamelen, &basecodec, &encovermap, + &decovermap, &encbufsize, &decbufsize, &flags)) + return NULL; + + if (!MultibyteCodec_Check(basecodec)) { + PyErr_SetString(PyExc_ValueError, "arg 2 must be a " + "MultibyteCodec object."); + return NULL; + } + + if (!PyDict_Check(encovermap) || !PyDict_Check(decovermap)) { + PyErr_SetString(PyExc_ValueError, + "both arg 3 and 4 must be dictionaries."); + return NULL; + } + + codec = ((MultibyteCodecObject *)basecodec)->codec; + if (codec->codecinit != NULL && codec->codecinit(codec->config) != 0) + return NULL; + + newconfig = PyMem_New(struct extcodec_config, 1); + if (newconfig == NULL) + return NULL; + + extcodec = PyMem_New(MultibyteCodec, 1); + if (extcodec == NULL) { + PyMem_Del(newconfig); + return NULL; + } + + memcpy(extcodec, &extcodec_template, sizeof(extcodec_template)); + extcodec->config = newconfig; + extcodec->encbufsize = newconfig->encbufsize = encbufsize; + extcodec->decbufsize = newconfig->decbufsize = decbufsize; + + newconfig->encovermap = encovermap; + newconfig->decovermap = decovermap; + newconfig->basecodec = ((MultibyteCodecObject *)basecodec)->codec; + newconfig->dataref = ((MultibyteCodecObject *)basecodec)->dataref; + newconfig->baseconfig = (void *)flags; + Py_INCREF(encovermap); + Py_INCREF(decovermap); + Py_INCREF(newconfig->dataref); + + extcodec_cobj = PyCObject_FromVoidPtr(extcodec, extcodec_dealloc); + if (extcodec_cobj == NULL) { + extcodec_dealloc(extcodec); + return NULL; + } + + extcodec->encoding = PyMem_Malloc(encnamelen + 1); + if (extcodec->encoding == NULL) { + extcodec_dealloc(extcodec); + return NULL; + } + memcpy((void *)extcodec->encoding, encname, encnamelen + 1); + + r = __create_codec(NULL, extcodec_cobj); + Py_DECREF(extcodec_cobj); + + return r; +} + static struct PyMethodDef __methods[] = { {"__create_codec", (PyCFunction)__create_codec, METH_O}, + {"create_extcodec", (PyCFunction)create_extcodec, METH_VARARGS}, {NULL, NULL}, }; Index: Modules/cjkcodecs/_codecs_iso2022.c =================================================================== --- Modules/cjkcodecs/_codecs_iso2022.c (revision 64531) +++ Modules/cjkcodecs/_codecs_iso2022.c (working copy) @@ -1115,7 +1115,7 @@ "iso2022_" #variation, \ &iso2022_##variation##_config, \ iso2022_codec_init, \ - _STATEFUL_METHODS(iso2022) \ + _STATEFUL_METHODS(iso2022, 2, 8) \ }, BEGIN_CODECS_LIST Index: Modules/cjkcodecs/_codecs_cn.c =================================================================== --- Modules/cjkcodecs/_codecs_cn.c (revision 64531) +++ Modules/cjkcodecs/_codecs_cn.c (working copy) @@ -435,10 +435,10 @@ END_MAPPINGS_LIST BEGIN_CODECS_LIST - CODEC_STATELESS(gb2312) - CODEC_STATELESS(gbk) - CODEC_STATELESS(gb18030) - CODEC_STATEFUL(hz) + CODEC_STATELESS(gb2312, 1, 2) + CODEC_STATELESS(gbk, 1, 2) + CODEC_STATELESS(gb18030, 2, 4) + CODEC_STATEFUL(hz, 1, 2) END_CODECS_LIST I_AM_A_MODULE_FOR(cn) Index: Modules/cjkcodecs/_codecs_hk.c =================================================================== --- Modules/cjkcodecs/_codecs_hk.c (revision 64531) +++ Modules/cjkcodecs/_codecs_hk.c (working copy) @@ -177,7 +177,7 @@ END_MAPPINGS_LIST BEGIN_CODECS_LIST - CODEC_STATELESS_WINIT(big5hkscs) + CODEC_STATELESS_WINIT(big5hkscs, 2, 2) END_CODECS_LIST I_AM_A_MODULE_FOR(hk) Index: Modules/cjkcodecs/multibytecodec.h =================================================================== --- Modules/cjkcodecs/multibytecodec.h (revision 64531) +++ Modules/cjkcodecs/multibytecodec.h (working copy) @@ -54,23 +54,28 @@ const char *encoding; const void *config; mbcodec_init codecinit; + mbencode_func encode; mbencodeinit_func encinit; mbencodereset_func encreset; + Py_ssize_t encbufsize; + mbdecode_func decode; mbdecodeinit_func decinit; mbdecodereset_func decreset; + Py_ssize_t decbufsize; } MultibyteCodec; typedef struct { PyObject_HEAD MultibyteCodec *codec; + PyObject *dataref; } MultibyteCodecObject; #define MultibyteCodec_Check(op) ((op)->ob_type == &MultibyteCodec_Type) #define _MultibyteStatefulCodec_HEAD \ - PyObject_HEAD \ + PyObject_VAR_HEAD \ MultibyteCodec *codec; \ MultibyteCodec_State state; \ PyObject *errors; @@ -78,42 +83,26 @@ _MultibyteStatefulCodec_HEAD } MultibyteStatefulCodecContext; -#define MAXENCPENDING 2 -#define _MultibyteStatefulEncoder_HEAD \ - _MultibyteStatefulCodec_HEAD \ - Py_UNICODE pending[MAXENCPENDING]; \ - Py_ssize_t pendingsize; typedef struct { - _MultibyteStatefulEncoder_HEAD -} MultibyteStatefulEncoderContext; - -#define MAXDECPENDING 8 -#define _MultibyteStatefulDecoder_HEAD \ - _MultibyteStatefulCodec_HEAD \ - unsigned char pending[MAXDECPENDING]; \ + _MultibyteStatefulCodec_HEAD + PyObject *stream; /* not used in IncrementalEncoder */ Py_ssize_t pendingsize; -typedef struct { - _MultibyteStatefulDecoder_HEAD -} MultibyteStatefulDecoderContext; + Py_UNICODE pending[1]; +} MultibyteStatefulEncoder; -typedef struct { - _MultibyteStatefulEncoder_HEAD -} MultibyteIncrementalEncoderObject; +typedef MultibyteStatefulEncoder MultibyteIncrementalEncoderObject; +typedef MultibyteStatefulEncoder MultibyteStreamWriterObject; typedef struct { - _MultibyteStatefulDecoder_HEAD -} MultibyteIncrementalDecoderObject; + _MultibyteStatefulCodec_HEAD + PyObject *stream; /* not used in IncrementalDecoder */ + Py_ssize_t pendingsize; + unsigned char pending[1]; +} MultibyteStatefulDecoder; -typedef struct { - _MultibyteStatefulDecoder_HEAD - PyObject *stream; -} MultibyteStreamReaderObject; +typedef MultibyteStatefulDecoder MultibyteIncrementalDecoderObject; +typedef MultibyteStatefulDecoder MultibyteStreamReaderObject; -typedef struct { - _MultibyteStatefulEncoder_HEAD - PyObject *stream; -} MultibyteStreamWriterObject; - /* positive values for illegal sequences */ #define MBERR_TOOSMALL (-1) /* insufficient output buffer space */ #define MBERR_TOOFEW (-2) /* incomplete input buffer */ Index: Modules/cjkcodecs/_codecs_jp.c =================================================================== --- Modules/cjkcodecs/_codecs_jp.c (revision 64531) +++ Modules/cjkcodecs/_codecs_jp.c (working copy) @@ -719,13 +719,15 @@ END_MAPPINGS_LIST BEGIN_CODECS_LIST - CODEC_STATELESS(shift_jis) - CODEC_STATELESS(cp932) - CODEC_STATELESS(euc_jp) - CODEC_STATELESS(shift_jis_2004) - CODEC_STATELESS(euc_jis_2004) - { "euc_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(euc_jis_2004) }, - { "shift_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(shift_jis_2004) }, + CODEC_STATELESS(shift_jis, 1, 2) + CODEC_STATELESS(cp932, 1, 2) + CODEC_STATELESS(euc_jp, 1, 3) + CODEC_STATELESS(shift_jis_2004, 2, 2) + CODEC_STATELESS(euc_jis_2004, 2, 3) + { "euc_jisx0213", (void *)2000, NULL, + _STATELESS_METHODS(euc_jis_2004, 2, 3) }, + { "shift_jisx0213", (void *)2000, NULL, + _STATELESS_METHODS(shift_jis_2004, 2, 2) }, END_CODECS_LIST I_AM_A_MODULE_FOR(jp) Index: Modules/cjkcodecs/_codecs_kr.c =================================================================== --- Modules/cjkcodecs/_codecs_kr.c (revision 64531) +++ Modules/cjkcodecs/_codecs_kr.c (working copy) @@ -31,6 +31,8 @@ 0xbb, 0xbc, 0xbd, 0xbe }; +#define EUC_KR_NO_MAKE_UP (void *)1 + ENCODER(euc_kr) { while (inleft > 0) { @@ -54,6 +56,8 @@ OUT2((code & 0xFF) | 0x80) NEXT(1, 2) } + else if (config == EUC_KR_NO_MAKE_UP) + return 1; else { /* Mapping is found in CP949 extension, * but we encode it in KS X 1001:1998 Annex 3, * make-up sequence for EUC-KR. */ @@ -114,8 +118,8 @@ REQUIRE_INBUF(2) - if (c == EUCKR_JAMO_FIRSTBYTE && - IN2 == EUCKR_JAMO_FILLER) { + if (c == EUCKR_JAMO_FIRSTBYTE && IN2 == EUCKR_JAMO_FILLER && + config != EUC_KR_NO_MAKE_UP) { /* KS X 1001:1998 Annex 3 make-up sequence */ DBCHAR cho, jung, jong; @@ -444,9 +448,9 @@ END_MAPPINGS_LIST BEGIN_CODECS_LIST - CODEC_STATELESS(euc_kr) - CODEC_STATELESS(cp949) - CODEC_STATELESS(johab) + CODEC_STATELESS(euc_kr, 1, 8) + CODEC_STATELESS(cp949, 1, 2) + CODEC_STATELESS(johab, 1, 2) END_CODECS_LIST I_AM_A_MODULE_FOR(kr) Index: Modules/cjkcodecs/cjkcodecs.h =================================================================== --- Modules/cjkcodecs/cjkcodecs.h (revision 64531) +++ Modules/cjkcodecs/cjkcodecs.h (working copy) @@ -211,28 +211,32 @@ (const struct dbcs_map *)_mapping_list; #define BEGIN_CODECS_LIST static const MultibyteCodec _codec_list[] = { -#define _STATEFUL_METHODS(enc) \ - enc##_encode, \ - enc##_encode_init, \ - enc##_encode_reset, \ - enc##_decode, \ - enc##_decode_init, \ - enc##_decode_reset, -#define _STATELESS_METHODS(enc) \ - enc##_encode, NULL, NULL, \ - enc##_decode, NULL, NULL, -#define CODEC_STATEFUL(enc) { \ - #enc, NULL, NULL, \ - _STATEFUL_METHODS(enc) \ + +#define _STATEFUL_METHODS(enc, encbufsize, decbufsize) \ + enc##_encode, \ + enc##_encode_init, \ + enc##_encode_reset, \ + encbufsize, \ + enc##_decode, \ + enc##_decode_init, \ + enc##_decode_reset, \ + decbufsize +#define _STATELESS_METHODS(enc, encbufsize, decbufsize) \ + enc##_encode, NULL, NULL, encbufsize, \ + enc##_decode, NULL, NULL, decbufsize + +#define CODEC_STATEFUL(enc, encbufsize, decbufsize) { \ + #enc, NULL, NULL, \ + _STATEFUL_METHODS(enc, encbufsize, decbufsize) \ }, -#define CODEC_STATELESS(enc) { \ - #enc, NULL, NULL, \ - _STATELESS_METHODS(enc) \ +#define CODEC_STATELESS(enc, encbufsize, decbufsize) { \ + #enc, NULL, NULL, \ + _STATELESS_METHODS(enc, encbufsize, decbufsize) \ }, -#define CODEC_STATELESS_WINIT(enc) { \ - #enc, NULL, \ - enc##_codec_init, \ - _STATELESS_METHODS(enc) \ +#define CODEC_STATELESS_WINIT(enc, encbufsize, decbufsize) { \ + #enc, NULL, \ + enc##_codec_init, \ + _STATELESS_METHODS(enc, encbufsize, decbufsize) \ }, #define END_CODECS_LIST \ {"", NULL,} }; \ @@ -394,5 +398,4 @@ if (m != NULL) \ (void)register_maps(m); \ } - #endif