【发布时间】:2023-03-22 18:47:01
【问题描述】:
我正在开发一个程序,我应该拒绝任何高于 U+10FFFF 的代码点。这看起来很简单,除了我不知道如何在我的正则表达式中表示这样一个代码点范围。我想做这样的事情
valid_character = re.compile(u'[\u0000-\u10FFFF]')
然后对任何不匹配的内容进行适当处理。但是,\u 似乎只识别前四个字符,即10FF。有没有其他方法来表示这个代码点范围或处理这种情况?
This site 推荐u"\U0010FFFF",但这似乎也不起作用。
>>> ord(u'\U0010FFFF')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 2 found
【问题讨论】:
-
您的输入是什么样的?根据定义,Python 应该拒绝任何高于 U+10ffff 的 Unicode“字符”,因为它们不存在。
-
它不能用
\u或\U语法指定,因为U+10FFFF以上的字符不是有效的Unicode。你的文件的编码是什么?提供一个包含您需要过滤的字符的示例。 -
原始的UTF-8 design 允许使用 5 字节和 6 字节的 UTF-8 编码,因此有人可能会生成使用这种方式编码的非法 Unicode 字符的文件。
-
如果您使用违反规范的 UTF-8 解码文件,Python 会抛出错误,因此您的问题的答案是“只需打开文件并将其解码为 UTF-8”。如果字符无效,Python 会处理它。
-
根据 Unicode 标准的定义,没有 Unicode 字符,也没有超过 U+10FFFF 的 Unicode 代码点。你应该重写问题。
标签: python regex python-2.7 unicode utf-8