在 python 3 中编码/解码时具有非 ASCII 字符的问题



我正在尝试使用 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└--

相关内容

  • 没有找到相关文章

最新更新