# Source code for fontTools.unicode

    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)