【问题标题】:Identify code points above U+10FFFF识别 U+10FFFF 以上的代码点
【发布时间】: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


【解决方案1】:

如果您使用违反规范的 UTF-8 解码文件,Python 会抛出错误,因此您的问题的答案是“只需打开文件并将其解码为 UTF-8”。如果字符无效,Python会处理它。

例子:

>>> b'\xf4\x8f\xbf\xbf'.decode('utf8')
u'\U0010ffff'

# UTF-8 equivalent to \U00110000...
>>> len(b'\xf4\x90\x80\x80'.decode('utf8'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\dev\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-2: invalid continuation byte

【讨论】:

  • 这解决了 OP 的 X-Y 问题,这很好……但它让我想知道如何构造 OP 的正则表达式。
  • @Jongware,可能类似于this answer。它会找到有效的 UTF-8 序列。
猜你喜欢
  • 2018-10-18
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 2019-04-07
  • 2010-11-24
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多