| def _makeunicodes(f): |
| lines = iter(f.readlines()) |
| unicodes = {} |
| for line in lines: |
| if not line: |
| continue |
| num, name = line.split(";")[:2] |
| if name[0] == "<": |
| continue # "<control>", etc. |
| num = int(num, 16) |
| unicodes[num] = name |
| return unicodes |
| |
| |
| class _UnicodeCustom(object): |
| def __init__(self, f): |
| if isinstance(f, str): |
| with open(f) as fd: |
| codes = _makeunicodes(fd) |
| else: |
| codes = _makeunicodes(f) |
| self.codes = codes |
| |
| def __getitem__(self, charCode): |
| try: |
| return self.codes[charCode] |
| except KeyError: |
| return "????" |
| |
| |
| class _UnicodeBuiltin(object): |
| def __getitem__(self, charCode): |
| try: |
| # use unicodedata backport to python2, if available: |
| # https://github.com/mikekap/unicodedata2 |
| import unicodedata2 as unicodedata |
| except ImportError: |
| import unicodedata |
| try: |
| return unicodedata.name(chr(charCode)) |
| except ValueError: |
| return "????" |
| |
| |
| Unicode = _UnicodeBuiltin() |
| |
| |
| def setUnicodeData(f): |
| global Unicode |
| Unicode = _UnicodeCustom(f) |