gpt4 book ai didi

python - 在 Python 2 中编码转义字符而不破坏 Unicode 的正确方法是什么?

转载 作者:太空狗 更新时间:2023-10-30 02:34:10 25 4
gpt4 key购买 nike

我想我对 Python 的 unicode 字符串快要发疯了。我正在尝试对 Unicode 字符串中的转义字符进行编码,转义实际的 Unicode 字符。我明白了:

In [14]: a = u"Example\n"

In [15]: b = u"Пример\n"

In [16]: print a
Example


In [17]: print b
Пример


In [18]: print a.encode('unicode_escape')
Example\n

In [19]: print b.encode('unicode_escape')
\u041f\u0440\u0438\u043c\u0435\u0440\n

虽然我迫切需要(很明显,英语示例可以按我的意愿运行):

In [18]: print a.encode('unicode_escape')
Example\n

In [19]: print b.encode('unicode_escape')
Пример\n

除了迁移到 Python 3,我该怎么办?

PS:正如下面所指出的,我实际上是在寻求转义控制字符。我是否需要的不仅仅是这些还需要观察。

最佳答案

反斜杠转义 unicode 数据中间的 ascii 控制字符绝对是一件很有用的事情。但这不仅仅是转义它们,当您想要返回实际字符​​数据时,它还正确地取消转义它们。

在 python stdlib 中应该有一种方法可以做到这一点,但没有。我提交了错误报告:http://bugs.python.org/issue18679

但与此同时,这里有一个使用翻译和 hackery 的工作:

tm = dict((k, repr(chr(k))[1:-1]) for k in range(32))
tm[0] = r'\0'
tm[7] = r'\a'
tm[8] = r'\b'
tm[11] = r'\v'
tm[12] = r'\f'
tm[ord('\\')] = '\\\\'

b = u"Пример\n"
c = b.translate(tm)
print(c) ## results in: Пример\n

所有非反斜杠单字母控制字符都将使用\x## 序列进行转义,但如果您需要对这些字符进行一些不同的处理,您的翻译矩阵可以做到这一点。这种方法虽然没有损耗,但对我有用。

但是把它恢复出来也很麻烦,因为你不能只使用翻译将字符序列翻译回单个字符。

d = c.encode('latin1', 'backslashreplace').decode('unicode_escape')
print(d) ## result in Пример with trailing newline character

您实际上必须使用 latin1 对映射到字节的字符进行单独编码,同时使用反斜杠转义 latin1 不知道的 unicode 字符,以便 unicode_escape 编解码器可以以正确的方式处理所有内容。

更新:

所以我有一个案例,我需要它在 python2.7 和 python3.3 中工作。这是我所做的(埋在 _compat.py 模块中):

if isinstance(b"", str):                                                        
byte_types = (str, bytes, bytearray)
text_types = (unicode, )
def uton(x): return x.encode('utf-8', 'surrogateescape')
def ntob(x): return x
def ntou(x): return x.decode('utf-8', 'surrogateescape')
def bton(x): return x
else:
byte_types = (bytes, bytearray)
text_types = (str, )
def uton(x): return x
def ntob(x): return x.encode('utf-8', 'surrogateescape')
def ntou(x): return x
def bton(x): return x.decode('utf-8', 'surrogateescape')

escape_tm = dict((k, ntou(repr(chr(k))[1:-1])) for k in range(32))
escape_tm[0] = u'\0'
escape_tm[7] = u'\a'
escape_tm[8] = u'\b'
escape_tm[11] = u'\v'
escape_tm[12] = u'\f'
escape_tm[ord('\\')] = u'\\\\'

def escape_control(s):
if isinstance(s, text_types):
return s.translate(escape_tm)
else:
return s.decode('utf-8', 'surrogateescape').translate(escape_tm).encode('utf-8', 'surrogateescape')

def unescape_control(s):
if isinstance(s, text_types):
return s.encode('latin1', 'backslashreplace').decode('unicode_escape')
else:
return s.decode('utf-8', 'surrogateescape').encode('latin1', 'backslashreplace').decode('unicode_escape').encode('utf-8', 'surrogateescape')

关于python - 在 Python 2 中编码转义字符而不破坏 Unicode 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9778550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com