如何在python 3中使用raw_unicode_escape编码打印字符串?

时间:2010-06-14 15:43:34

标签: python unicode python-3.x

以下代码在Python 3.x中使用TypeError: must be str, not bytes失败,因为现在encode()返回bytesprint()只需要str

#!/usr/bin/python
from __future__ import print_function
str2 = "some unicode text"
print(str2.encode('raw_unicode_escape'))

如何使用print()打印Unicode字符串转义表示?我正在寻找一种适用于Python 2.6或更高版本的解决方案,包括3.x

更新

下面的行适用于3.x但它不适用于2.6,生成AttributeError: 'file' object has no attribute 'buffer'

sys.stdout.buffer.write(str2.encode('raw_unicode_escape'))

3 个答案:

答案 0 :(得分:5)

我只是使用:

print(str2.encode('raw_unicode_escape').decode('ascii'))

如果你想在Python 3和Python 2.6中使用相同的代码(否则你可以在2.6中使用repr,在Python 3中使用ascii,但这并不是真的“相同”; - )。

答案 1 :(得分:1)

我无法重现您的问题,请参阅previous revisions of this answer了解我的尝试记录(解释了我在评论中的链接)。

然而:

看起来你正试图通过自己完成所有的工作来强制编写文件。但是在Python 3中,open()接受encoding参数,为您完成所有魔法。

badp@delta:~$ python3
Python 3.1.2 (r312:79147, Apr 15 2010, 12:35:07) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> foo = open("look mah, utf-32", "w", encoding="utf-32")
>>> foo.write("bar")
3
>>> foo.close()
>>> foo = open("look mah, utf-32", "rb")
>>> foo.read()
b'\xff\xfe\x00\x00b\x00\x00\x00a\x00\x00\x00r\x00\x00\x00'

如果您正在寻找等效的Python 2,您似乎真的想要使用io.open()

答案 2 :(得分:0)

http://docs.python.org/py3k/library/functions.html#ascii

  

作为repr(),返回一个包含对象的可打印表示的字符串,但使用\ x,\ u或\ U转义转义repr()返回的字符串中的非ASCII字符。这会生成一个类似于Python 2中repr()返回的字符串。

结果字符串确实是str类型,而不是bytes

示例:

>>> a = '''Ⴊ ⇠ ਐ ῼ இ ╁ ଠ ୭ ⅙ ㈣'''
>>> ascii(a)
"'\\u10aa \\u21e0 \\u0a10 \\u1ffc \\u0b87 \\u2541 \\u0b20 \\u0b6d \\u2159 \\u3223'"
>>> print(ascii(a))
'\u10aa \u21e0 \u0a10 \u1ffc \u0b87 \u2541 \u0b20 \u0b6d \u2159 \u3223'

如果你想删除多余的引号,你可以print(ascii(a)[1:-1])

编辑:正如Alex所说,你必须在Python 2.6中使用repr而不是ascii。他的解决方案确实适用于Python 2和3,但是如果你计划进行很多转换(因此更喜欢更容易输入多次),一种可能性是在程序开头添加一个条件如下:

import sys
if sys.version_info[0] == 3:
    unic = ascii
else:
    unic = repr

然后,只要在Python 2中使用unic,在Python 3中使用repr,就可以使用ascii(或任何你想要的名称)。

...虽然我想如果你想要更加小心,可以使用elif sys.version_info[0] == 2:代替else: