代码之家  ›  专栏  ›  技术社区  ›  Ξένη Γήινος

Python检查是否分配了Unicode代码点

  •  0
  • Ξένη Γήινος  · 技术社区  · 4 年前

    我正在使用Python3,我对它了如指掌 hex , int chr , ord , '\uxxxx' '\U00xxxxxx' escape和Unicode有1114111个代码点。。。

    我的问题很简单:如何检查Unicode码点是否是有效的Unicode码点,Unicode码点仅在明确映射到权威定义的字符时才是有效的码点。

    例如,代码点720是有效的Unicode,十六进制为0x2d0,U+02D0指向:

    In [135]: hex(720)
    Out[135]: '0x2d0'
    
    In [136]: '\u02d0'
    Out[136]: 'ː'
    

    In [137]: hex(888)
    Out[137]: '0x378'
    
    In [138]: '\u0378'
    Out[138]: '\u0378'
    

    In [139]: chr(127744)
    Out[139]: '🌀'
    

    并且0xe0000无效:

    In [140]: '\U000e0000'
    Out[140]: '\U000e0000'
    

    那么如何检查代码点是否有效?

    我提出了一个相当棘手的解决方案,因为如果一个代码点是有效的,尝试将其转换为一个字符将导致解码字符或 '\xhh' 转义序列,否则它将返回与原始序列完全相同的未编码转义序列,我可以检查 chr 并检查它是否以 '\u' '\U' ...

    chr repr 返回值并检查结果。。。

    我已使用此方法识别所有无效代码点:

    In [130]: invalid = []
    
    In [131]: for i in range(1114112):
         ...:     if any(f'{chr(i)!r}'.startswith(j) for j in ("'\\U", "'\\u")):
         ...:         invalid.append(i)
    
    In [132]: from pathlib import Path
    
    In [133]: invalid = [(hex(i).removeprefix('0x'), i) for i in invalid]
    
    In [134]: Path('D:/invalid_unicode.txt').write_text(',\n'.join(map(repr, invalid)))
    Out[134]: 18574537
    

    有谁能提供更好的解决方案吗?

    1 回复  |  直到 4 年前
        1
  •  1
  •   Ture Pålsson    4 年前

    我想 unicodedata.name() 你想干什么就干什么。