import codecs # from utf-8 to iso6937 def iso6937_encode(input,errors,encoding_map): result = b'' num_bytes = 0 for c in input: try: if c in encoding_map: num_bytes += 2 result += encoding_map[c][0] + encoding_map[c][1] else: code = ord(c) if code > 0xFF: num_bytes += 1 result += bytes([code >> 8]) num_bytes += 1 result += bytes([code & 0xFF]) except KeyError: raise UnicodeError("Internal conversion algorithm error") return (result, num_bytes) # from iso6937 to utf-8 def iso6937_decode(input,errors,decoding_map): result = '' num_bytes = 0 i = 0 while i < len(input): c = bytes([input[i]]) try: if c in nonspacing_diacritical_marks: i += 1 if i >= len(input): raise KeyError char = c + bytes([input[i]]) if char in decoding_map: num_bytes += 2 result += decoding_map[char] else: raise KeyError else: num_bytes += 1 result += chr(c[0]) except KeyError: if errors == 'strict': raise UnicodeError("Unrecognized iso6937 character") elif errors == 'replace': num_bytes += 1 result += chr(0x3f) #question mark elif errors == 'ignore': pass else: raise UnicodeError("Unknown error handling") i += 1 return (result, num_bytes) ### Codec APIs class Codec(codecs.Codec): def encode(self,input,errors='strict'): return iso6937_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): return iso6937_decode(input,errors,decoding_map) class IncrementalEncoder(codecs.IncrementalEncoder): def encode(self, input, final=False): return iso6937_encode(input,self.errors,encoding_map)[0] class IncrementalDecoder(codecs.IncrementalDecoder): def decode(self, input, final=False): return iso6937_decode(input,self.errors,decoding_map)[0] class StreamWriter(Codec,codecs.StreamWriter): pass class StreamReader(Codec,codecs.StreamReader): pass ### encodings module API def getregentry(): return codecs.CodecInfo( name='iso6937', encode=Codec().encode, decode=Codec().decode, incrementalencoder=IncrementalEncoder, incrementaldecoder=IncrementalDecoder, streamreader=StreamReader, streamwriter=StreamWriter, ) nonspacing_diacritical_marks = [b'\xc1', b'\xc2', b'\xc3', b'\xc4', b'\xc5', b'\xc6', b'\xc7', b'\xc8', b'\xca', b'\xcb', b'\xcd', b'\xce', b'\xcf'] ### Decoding Map decoding_map = { b'\xc1'+b'A': 'À', b'\xc1'+b'E': 'È', b'\xc1'+b'I': 'Ì', b'\xc1'+b'O': 'Ò', b'\xc1'+b'U': 'Ù', b'\xc1'+b'a': 'à', b'\xc1'+b'e': 'è', b'\xc1'+b'i': 'ì', b'\xc1'+b'o': 'ò', b'\xc1'+b'u': 'ù', b'\xc2'+b'A': 'Á', b'\xc2'+b'C': 'Ć', b'\xc2'+b'E': 'É', b'\xc2'+b'I': 'Í', b'\xc2'+b'L': 'Ĺ', b'\xc2'+b'N': 'Ń', b'\xc2'+b'O': 'Ó', b'\xc2'+b'R': 'Ŕ', b'\xc2'+b'S': 'Ś', b'\xc2'+b'U': 'Ú', b'\xc2'+b'Y': 'Ý', b'\xc2'+b'Z': 'Ź', b'\xc2'+b'a': 'á', b'\xc2'+b'c': 'ć', b'\xc2'+b'e': 'é', b'\xc2'+b'g': 'ģ', b'\xc2'+b'i': 'í', b'\xc2'+b'l': 'ĺ', b'\xc2'+b'n': 'ń', b'\xc2'+b'o': 'ó', b'\xc2'+b'r': 'ŕ', b'\xc2'+b's': 'ś', b'\xc2'+b'u': 'ú', b'\xc2'+b'y': 'ý', b'\xc2'+b'z': 'ź', b'\xc3'+b'A': 'Â', b'\xc3'+b'C': 'Ĉ', b'\xc3'+b'E': 'Ê', b'\xc3'+b'G': 'Ĝ', b'\xc3'+b'H': 'Ĥ', b'\xc3'+b'I': 'Î', b'\xc3'+b'J': 'Ĵ', b'\xc3'+b'O': 'Ô', b'\xc3'+b'S': 'Ŝ', b'\xc3'+b'U': 'Û', b'\xc3'+b'W': 'Ŵ', b'\xc3'+b'Y': 'Ŷ', b'\xc3'+b'a': 'â', b'\xc3'+b'c': 'ĉ', b'\xc3'+b'e': 'ê', b'\xc3'+b'g': 'ĝ', b'\xc3'+b'h': 'ĥ', b'\xc3'+b'i': 'î', b'\xc3'+b'j': 'ĵ', b'\xc3'+b'o': 'ô', b'\xc3'+b's': 'ŝ', b'\xc3'+b'u': 'û', b'\xc3'+b'w': 'ŵ', b'\xc3'+b'y': 'ŷ', b'\xc4'+b'A': 'Ã', b'\xc4'+b'I': 'Ĩ', b'\xc4'+b'N': 'Ñ', b'\xc4'+b'O': 'Õ', b'\xc4'+b'U': 'Ũ', b'\xc4'+b'a': 'ã', b'\xc4'+b'i': 'ĩ', b'\xc4'+b'n': 'ñ', b'\xc4'+b'o': 'õ', b'\xc4'+b'u': 'ũ', b'\xc5'+b'A': 'Ā', b'\xc5'+b'E': 'Ē', b'\xc5'+b'I': 'Ī', b'\xc5'+b'O': 'Ō', b'\xc5'+b'U': 'Ū', b'\xc5'+b'a': 'ā', b'\xc5'+b'e': 'ē', b'\xc5'+b'i': 'ī', b'\xc5'+b'o': 'ō', b'\xc5'+b'u': 'ū', b'\xc6'+b'A': 'Ă', b'\xc6'+b'G': 'Ğ', b'\xc6'+b'U': 'Ŭ', b'\xc6'+b'a': 'ă', b'\xc6'+b'g': 'ğ', b'\xc6'+b'u': 'ŭ', b'\xc7'+b'C': 'Ċ', b'\xc7'+b'E': 'Ė', b'\xc7'+b'G': 'Ġ', b'\xc7'+b'I': 'İ', b'\xc7'+b'Z': 'Ż', b'\xc7'+b'c': 'ċ', b'\xc7'+b'e': 'ė', b'\xc7'+b'g': 'ġ', b'\xc7'+b'z': 'ż', b'\xc8'+b'A': 'Ä', b'\xc8'+b'E': 'Ë', b'\xc8'+b'I': 'Ï', b'\xc8'+b'O': 'Ö', b'\xc8'+b'U': 'Ü', b'\xc8'+b'Y': 'Ÿ', b'\xc8'+b'a': 'ä', b'\xc8'+b'e': 'ë', b'\xc8'+b'i': 'ï', b'\xc8'+b'o': 'ö', b'\xc8'+b'u': 'ü', b'\xc8'+b'y': 'ÿ', b'\xca'+b'A': 'Å', b'\xca'+b'U': 'Ů', b'\xca'+b'a': 'å', b'\xca'+b'u': 'ů', b'\xcb'+b'C': 'Ç', b'\xcb'+b'G': 'Ģ', b'\xcb'+b'K': 'Ķ', b'\xcb'+b'L': 'Ļ', b'\xcb'+b'N': 'Ņ', b'\xcb'+b'R': 'Ŗ', b'\xcb'+b'S': 'Ş', b'\xcb'+b'T': 'Ţ', b'\xcb'+b'c': 'ç', b'\xcb'+b'k': 'ķ', b'\xcb'+b'l': 'ļ', b'\xcb'+b'n': 'ņ', b'\xcb'+b'r': 'ŗ', b'\xcb'+b's': 'ş', b'\xcb'+b't': 'ţ', b'\xcd'+b'O': 'Ő', b'\xcd'+b'U': 'Ű', b'\xcd'+b'o': 'ő', b'\xcd'+b'u': 'ű', b'\xce'+b'A': 'Ą', b'\xce'+b'E': 'Ę', b'\xce'+b'I': 'Į', b'\xce'+b'U': 'Ų', b'\xce'+b'a': 'ą', b'\xce'+b'e': 'ę', b'\xce'+b'i': 'į', b'\xce'+b'u': 'ų', b'\xcf'+b'C': 'Č', b'\xcf'+b'D': 'Ď', b'\xcf'+b'E': 'Ě', b'\xcf'+b'L': 'Ľ', b'\xcf'+b'N': 'Ň', b'\xcf'+b'R': 'Ř', b'\xcf'+b'S': 'Š', b'\xcf'+b'T': 'Ť', b'\xcf'+b'Z': 'Ž', b'\xcf'+b'c': 'č', b'\xcf'+b'd': 'ď', b'\xcf'+b'e': 'ě', b'\xcf'+b'l': 'ľ', b'\xcf'+b'n': 'ň', b'\xcf'+b'r': 'ř', b'\xcf'+b's': 'š', b'\xcf'+b't': 'ť', b'\xcf'+b'z': 'ž', } ### Encoding Map encoding_map = { 'À': [b'\xc1',b'A'], 'È': [b'\xc1',b'E'], 'Ì': [b'\xc1',b'I'], 'Ò': [b'\xc1',b'O'], 'Ù': [b'\xc1',b'U'], 'à': [b'\xc1',b'a'], 'è': [b'\xc1',b'e'], 'ì': [b'\xc1',b'i'], 'ò': [b'\xc1',b'o'], 'ù': [b'\xc1',b'u'], 'Á': [b'\xc2',b'A'], 'Ć': [b'\xc2',b'C'], 'É': [b'\xc2',b'E'], 'Í': [b'\xc2',b'I'], 'Ĺ': [b'\xc2',b'L'], 'Ń': [b'\xc2',b'N'], 'Ó': [b'\xc2',b'O'], 'Ŕ': [b'\xc2',b'R'], 'Ś': [b'\xc2',b'S'], 'Ú': [b'\xc2',b'U'], 'Ý': [b'\xc2',b'Y'], 'Ź': [b'\xc2',b'Z'], 'á': [b'\xc2',b'a'], 'ć': [b'\xc2',b'c'], 'é': [b'\xc2',b'e'], 'ģ': [b'\xc2',b'g'], 'í': [b'\xc2',b'i'], 'ĺ': [b'\xc2',b'l'], 'ń': [b'\xc2',b'n'], 'ó': [b'\xc2',b'o'], 'ŕ': [b'\xc2',b'r'], 'ś': [b'\xc2',b's'], 'ú': [b'\xc2',b'u'], 'ý': [b'\xc2',b'y'], 'ź': [b'\xc2',b'z'], 'Â': [b'\xc3',b'A'], 'Ĉ': [b'\xc3',b'C'], 'Ê': [b'\xc3',b'E'], 'Ĝ': [b'\xc3',b'G'], 'Ĥ': [b'\xc3',b'H'], 'Î': [b'\xc3',b'I'], 'Ĵ': [b'\xc3',b'J'], 'Ô': [b'\xc3',b'O'], 'Ŝ': [b'\xc3',b'S'], 'Û': [b'\xc3',b'U'], 'Ŵ': [b'\xc3',b'W'], 'Ŷ': [b'\xc3',b'Y'], 'â': [b'\xc3',b'a'], 'ĉ': [b'\xc3',b'c'], 'ê': [b'\xc3',b'e'], 'ĝ': [b'\xc3',b'g'], 'ĥ': [b'\xc3',b'h'], 'î': [b'\xc3',b'i'], 'ĵ': [b'\xc3',b'j'], 'ô': [b'\xc3',b'o'], 'ŝ': [b'\xc3',b's'], 'û': [b'\xc3',b'u'], 'ŵ': [b'\xc3',b'w'], 'ŷ': [b'\xc3',b'y'], 'Ã': [b'\xc4',b'A'], 'Ĩ': [b'\xc4',b'I'], 'Ñ': [b'\xc4',b'N'], 'Õ': [b'\xc4',b'O'], 'Ũ': [b'\xc4',b'U'], 'ã': [b'\xc4',b'a'], 'ĩ': [b'\xc4',b'i'], 'ñ': [b'\xc4',b'n'], 'õ': [b'\xc4',b'o'], 'ũ': [b'\xc4',b'u'], 'Ā': [b'\xc5',b'A'], 'Ē': [b'\xc5',b'E'], 'Ī': [b'\xc5',b'I'], 'Ō': [b'\xc5',b'O'], 'Ū': [b'\xc5',b'U'], 'ā': [b'\xc5',b'a'], 'ē': [b'\xc5',b'e'], 'ī': [b'\xc5',b'i'], 'ō': [b'\xc5',b'o'], 'ū': [b'\xc5',b'u'], 'Ă': [b'\xc6',b'A'], 'Ğ': [b'\xc6',b'G'], 'Ŭ': [b'\xc6',b'U'], 'ă': [b'\xc6',b'a'], 'ğ': [b'\xc6',b'g'], 'ŭ': [b'\xc6',b'u'], 'Ċ': [b'\xc7',b'C'], 'Ė': [b'\xc7',b'E'], 'Ġ': [b'\xc7',b'G'], 'İ': [b'\xc7',b'I'], 'Ż': [b'\xc7',b'Z'], 'ċ': [b'\xc7',b'c'], 'ė': [b'\xc7',b'e'], 'ġ': [b'\xc7',b'g'], 'ż': [b'\xc7',b'z'], 'Ä': [b'\xc8',b'A'], 'Ë': [b'\xc8',b'E'], 'Ï': [b'\xc8',b'I'], 'Ö': [b'\xc8',b'O'], 'Ü': [b'\xc8',b'U'], 'Ÿ': [b'\xc8',b'Y'], 'ä': [b'\xc8',b'a'], 'ë': [b'\xc8',b'e'], 'ï': [b'\xc8',b'i'], 'ö': [b'\xc8',b'o'], 'ü': [b'\xc8',b'u'], 'ÿ': [b'\xc8',b'y'], 'Å': [b'\xca',b'A'], 'Ů': [b'\xca',b'U'], 'å': [b'\xca',b'a'], 'ů': [b'\xca',b'u'], 'Ç': [b'\xcb',b'C'], 'Ģ': [b'\xcb',b'G'], 'Ķ': [b'\xcb',b'K'], 'Ļ': [b'\xcb',b'L'], 'Ņ': [b'\xcb',b'N'], 'Ŗ': [b'\xcb',b'R'], 'Ş': [b'\xcb',b'S'], 'Ţ': [b'\xcb',b'T'], 'ç': [b'\xcb',b'c'], 'ķ': [b'\xcb',b'k'], 'ļ': [b'\xcb',b'l'], 'ņ': [b'\xcb',b'n'], 'ŗ': [b'\xcb',b'r'], 'ş': [b'\xcb',b's'], 'ţ': [b'\xcb',b't'], 'Ő': [b'\xcd',b'O'], 'Ű': [b'\xcd',b'U'], 'ő': [b'\xcd',b'o'], 'ű': [b'\xcd',b'u'], 'Ą': [b'\xce',b'A'], 'Ę': [b'\xce',b'E'], 'Į': [b'\xce',b'I'], 'Ų': [b'\xce',b'U'], 'ą': [b'\xce',b'a'], 'ę': [b'\xce',b'e'], 'į': [b'\xce',b'i'], 'ų': [b'\xce',b'u'], 'Č': [b'\xcf',b'C'], 'Ď': [b'\xcf',b'D'], 'Ě': [b'\xcf',b'E'], 'Ľ': [b'\xcf',b'L'], 'Ň': [b'\xcf',b'N'], 'Ř': [b'\xcf',b'R'], 'Š': [b'\xcf',b'S'], 'Ť': [b'\xcf',b'T'], 'Ž': [b'\xcf',b'Z'], 'č': [b'\xcf',b'c'], 'ď': [b'\xcf',b'd'], 'ě': [b'\xcf',b'e'], 'ľ': [b'\xcf',b'l'], 'ň': [b'\xcf',b'n'], 'ř': [b'\xcf',b'r'], 'š': [b'\xcf',b's'], 'ť': [b'\xcf',b't'], 'ž': [b'\xcf',b'z'], }