【问题标题】:Regex to match all unicode character above '\uFFFF'正则表达式匹配 '\uFFFF' 上方的所有 unicode 字符
【发布时间】:2016-07-13 14:24:49
【问题描述】:

当我得到 UCS-4 字符时,Pygame 和 Pyglet 都崩溃了:

exceptions.UnicodeError: 发现 '\uFFFF' 上方的 Unicode 字符;不支持

如何使用正则表达式过滤所有这些字符?

【问题讨论】:

    标签: python regex unicode ucs2


    【解决方案1】:

    虽然您的问题要求使用正则表达式,但它并不是最合适的工具。您可以遍历变量中的每个字符,使用 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)。

    【讨论】:

    • 这能正确处理代理对吗?
    • 代理对只有在 unicode 字符串被编码时才可能存在(例如在 UTF16 中)。因此,在 python 解码它们之后,它们在内部表示为代码点。在我的示例中,\U0001FFFF 必须由 UTF-16 中的代理对编码(但不是在 Python 内部)。所以答案是是的。由于您的问题指定了 UCS-4,其中所有代码点均由 32 位表示,因此 UCS-4 不应具有代理对。
    • @RyanHope:它不处理代理:re.sub('[\U00010000-\U0010FFFF]', '', '\udbff\udfff') != ''。虽然(通常)你不应该得到包含代理的 Unicode 字符串。见Python issue 18814: Add utilities to "clean" surrogate code points from strings
    【解决方案2】:

    字体实际上可能是这里真正的问题,所以我不确定使用正则表达式的过滤效果如何。我建议您查看 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 字体模块。

    http://www.pygame.org/docs/ref/font.html

    【讨论】:

    • 如果您想使用正则表达式进行过滤,那么这个答案可能会有所帮助:stackoverflow.com/a/3220210/499581
    • 在 OSX 或 Windows 上使用 pygame.freetype 似乎不是一个可行的解决方案。没有一个 pygame 二进制版本包含我尝试过的这个。
    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    相关资源
    最近更新 更多