【发布时间】:2016-07-13 14:24:49
【问题描述】:
当我得到 UCS-4 字符时,Pygame 和 Pyglet 都崩溃了:
exceptions.UnicodeError: 发现 '\uFFFF' 上方的 Unicode 字符;不支持
如何使用正则表达式过滤所有这些字符?
【问题讨论】:
当我得到 UCS-4 字符时,Pygame 和 Pyglet 都崩溃了:
exceptions.UnicodeError: 发现 '\uFFFF' 上方的 Unicode 字符;不支持
如何使用正则表达式过滤所有这些字符?
【问题讨论】:
虽然您的问题要求使用正则表达式,但它并不是最合适的工具。您可以遍历变量中的每个字符,使用 ord(c) > 0xFFFF 来检测有问题的字符。
但如果您需要正则表达式,请尝试 (python3)
import re
r1 = re.compile("[\U00010000-\U0010FFFF]")
m1 = r1.search( "Text\u00A0\U0001FFFF" )
print (m1.group())
print (m1.start())
print (m1.end())
对于python2,只需在字符串文字前添加“u”(使其成为unicode)。
【讨论】:
\U0001FFFF 必须由 UTF-16 中的代理对编码(但不是在 Python 内部)。所以答案是是的。由于您的问题指定了 UCS-4,其中所有代码点均由 32 位表示,因此 UCS-4 不应具有代理对。
re.sub('[\U00010000-\U0010FFFF]', '', '\udbff\udfff') != ''。虽然(通常)你不应该得到包含代理的 Unicode 字符串。见Python issue 18814: Add utilities to "clean" surrogate code points from strings
字体实际上可能是这里真正的问题,所以我不确定使用正则表达式的过滤效果如何。我建议您查看 pygame.freetype 模块,因为它不限制使用高于 \uFFFF 范围的代码点。
使用 pygame.freetypeEnhanced Pygame 模块进行加载和 将基于 pygame.ftfont 的计算机字体渲染为 pygame.fontpygame 用于加载和渲染字体的模块定义环境变量 第一次导入pygame前的PYGAME_FREETYPE顶层pygame 包裹。 pygame.ftfont 是一个 pygame.fontpygame 模块,用于加载和 渲染字体兼容模块,该模块通过除一种字体之外的所有字体 模块单元测试:它没有 UCS-2 的限制 基于 SDL_ttf 的字体模块,因此无法引发代码异常 点大于“uFFFF”。如果 pygame.freetypeEnhanced Pygame 模块 加载和渲染计算机字体不可用,则 将改为加载 SDL_ttf 字体模块。
【讨论】: