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] 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', }