在python2+GTK中检测/删除未配对的代理项字符

2024-10-01 07:49:09 发布

您现在位置:Python中文网/ 问答频道 /正文

在python2.7中,我可以成功地将Unicode字符串"abc\udc34xyz"转换为UTF-8(结果是"abc\xed\xb0\xb4xyz")。但是,当我把UTF-8字符串传递给例如pango_parse_markup()g_convert_with_fallback()时,我会得到诸如“转换输入中的无效字节序列”之类的错误。显然,GTK/Pango函数检测字符串中的“未配对代理项”,并且(正确吗?)拒绝它。在

python3甚至不允许将Unicode字符串转换为UTF-8(错误:“'UTF-8'codec无法对位置3中的字符'\udc34'进行编码:不允许使用代理项”),但我可以运行"abc\udc34xyz".encode("utf8", "replace")来获取有效的UTF8字符串,其中唯一的代理项被其他字符替换。这对我来说很好,但是我需要一个Python2的解决方案。在

所以问题是:在Python2.7中,如何将Unicode字符串转换为UTF-8,同时用U+FFFD等替换字符替换单独的代理项?最好只使用标准的Python函数和GTK/GLib/G。。。应该使用函数。在

顺便说一句,Iconv可以将字符串转换为UTF8,但只需删除错误字符,而不是用U+FFFD替换它。在


Tags: 函数字符串代理gtk错误unicodeutf8字符
2条回答

您可以在编码之前自己进行替换:

import re

lone = re.compile(
    ur'''(?x)            # verbose expression (allows comments)
    (                    # begin group
    [\ud800-\udbff]      #   match leading surrogate
    (?![\udc00-\udfff])  #   but only if not followed by trailing surrogate
    )                    # end group
    |                    #  OR
    (                    # begin group
    (?<![\ud800-\udbff]) #   if not preceded by leading surrogate
    [\udc00-\udfff]      #   match trailing surrogate
    )                    # end group
    ''')

u = u'abc\ud834\ud82a\udfcdxyz'
print repr(u)
b = lone.sub(ur'\ufffd',u).encode('utf8')
print repr(b)
print repr(b.decode('utf8'))

输出:

^{pr2}$

以下是解决这个问题的方法:

invalid_string.encode('utf16').decode('utf16', 'replace')

我的理解是代理对是UTF-16的一部分,这就是为什么用UTF-8进行编码/解码没有任何作用。在

相关问题 更多 >