嗯,字符编码和解码有时会让我很沮丧。
因此我们知道u'\u4f60\u597d'
是utf-8
的{{1}}编码,
你好
现在我真正希望从输出中获取或写入文件的是>>> print hellolist
[u'\u4f60\u597d']
>>> print hellolist[0]
你好
,但它始终是[u'你好']
,那么你是如何做到的?
答案 0 :(得分:4)
你是误会。
python中的 u''
是而不是 utf-8,它只是Unicode(除了在Python上的Windows< = 3.2,而它是utf-16
)。< / p>
utf-8是Unicode的编码,必须是bytes
的序列。
此外,u'你'
和u'\u4f60'
完全相同。简单来说,在Python2中,repr
高字符使用转义而不是原始值。
由于Python2现在很快就要进入EOL,你应该开始认真考虑切换到Python3。在Python3中跟踪所有这些内容要容易得多,因为只有一种字符串类型,当.encode
和.decode
时它更加清晰。
答案 1 :(得分:4)
当您打印(或写入文件)列表时,它在内部调用列表的str()
方法,但列表内部调用其元素上的repr()
。 repr()
返回您看到的丑陋的unicode表示。
repr示例 -
>>> h = u'\u4f60\u597d'
>>> print h
\u4f60\u597d
>>> print repr(h)
u'\u4f60\u597d'
您需要手动获取列表中的元素并打印它们才能正确打印。
示例 -
>>> h1 = [h,u'\u4f77\u587f']
>>> print u'[' + u','.join([u"'" + unicode(i) + u"'" for i in h1]) + u']'
对于包含可能具有unicode字符的子列表的列表,您需要一个递归函数,例如 -
>>> h1 = [h,(u'\u4f77\u587f',)]
>>> def listprinter(l):
... if isinstance(l, list):
... return u'[' + u','.join([listprinter(i) for i in l]) + u']'
... elif isinstance(l, tuple):
... return u'(' + u','.join([listprinter(i) for i in l]) + u')'
... elif isinstance(l, (str, unicode)):
... return u"'" + unicode(l) + u"'"
...
>>>
>>>
>>> print listprinter(h1)
要将它们保存到文件,请使用相同的列表推导或递归功能。示例 -
with open('<filename>','w') as f:
f.write(listprinter(l))
答案 2 :(得分:0)
with open("some_file.txt","wb") as f:
f.write(hellolist[0].encode("utf8"))
我认为会解决您的问题
大多数文本编辑器都使用utf8编码:)
虽然其他答案都是正确的,但没有一个真正解决了您的问题
>>> u'\u4f60\u597d'.encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
如果你想要括号
>>> u'[u\u4f60\u597d,]'.encode("utf8")
答案 3 :(得分:0)
一件事是unicode角色本身
hellolist = u&#39; \ u4f60 \&#39;
另一个是如何代表它。
您可以通过多种方式表示它,具体取决于您要显示的位置。
Web:UTF-8 数据库:可能是UTF-16或UTF-8 日本网站:EUC-JP或Shift JIS
例如本 http://unicode.org/cgi-bin/GetUnihanData.pl?codepoint=672c http://www.fileformat.info/info/unicode/char/672c/index.htm