我正在尝试使用 python3 unicode_escape 在我的字符串中转义 ,但挑战是整个字符串中存在非 ASCII 字符,如果我使用 utf8 编码然后使用 unicode_escape 解码字节,那么特殊字符就会乱码。有没有办法让用新行转义而不会弄乱特殊字符?
s = "hello\nworld└--"
print(s.encode('utf8').decode('unicode_escape'))
Expected Result:
hello
world└--
Actual Result:
hello
worldâ--
正如用户 wowcha 观察到的那样,unicode-escape
编解码器采用latin-1
编码,但您的字符串包含不可编码为 latin-1
的字符。
>>> s = "hello\nworld└--"
>>> s.encode('latin-1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'latin-1' codec can't encode character 'u2514' in position 12: ordinal not in range(256)
按utf-8
编码字符串可以绕过编码问题,但在从unicode-escape
解码时会导致 mojibake
解决方案是在编码时使用反斜杠替换错误处理程序。 这会将问题字符转换为转义序列,该转义序列可以编码为 latin-1
,并且在从 unicode-escape
解码时不会被破坏。
>>> s.encode('latin-1', errors='backslashreplace')
b'hello\nworld\u2514--'
>>> s.encode('latin-1', errors='backslashreplace').decode('unicode-escape')
'hellonworld└--'
>>> print(s.encode('latin-1', errors='backslashreplace').decode('unicode-escape'))
hello
world└--
您遇到的问题是unicode_escape
在 Python 3.3 中已弃用,它似乎假设您的代码是"latin-1",因为这是 unicode_excape
函数中使用的原始编解码器......
查看编解码器的python文档,我们看到Encoding suitable as the contents of a Unicode literal in ASCII-encoded Python source code, except that quotes are not escaped. Decodes from Latin-1 source code. Beware that Python source code actually uses UTF-8 by default.
告诉我们unicode_escape
假定您的文本是ISO Latin-1。因此,如果我们使用 latin1 编码运行您的代码,我们会收到此错误:
s.encode('latin1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'latin-1' codec can't encode character 'u2514' in position 12: ordinal not in range(256)
并且 unicode 字符错误'u2514'
转换时'└'
最简单的表达方式是该字符不能在 Latin-1 字符串中使用,因此为什么你会得到不同的字符。
我也认为指出在你的字符串中你有'\n'
是正确的,而不仅仅是'n'
额外的反斜杠意味着这个符号不是回车符,而是被忽略,反斜杠表示忽略'n'
。也许尽量不使用\n
...
尝试删除第二个转义反斜杠并使用 utf8 解码:
>>> s = "hellonworld└--"
>>> print(s.encode('utf8').decode('utf8'))
hello
world└--