我正在使用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
有谁能提供更好的解决方案吗?