我从数据库中获得了一些类似于'\xe7\x8e\xa9'
的字符串。
我认为它是utf-8。我可以使用以下方式打印出来:
print '\xe7\x8e\xa9'
玩
事情是,我需要将它们作为中文字符(例如玩)与其他字母数字数据一起写入另一个文件。
我尝试encode
,decode
,但我没有得到我希望的结果。
以下是我的尝试:
f = open('a','w')
name = u.name #.encode('utf8') # I commented it to get raw
f.write('\t$$%r$$many_other_data' % name)
f.close()
当我用vim7.4打开输出文件时:
`$$u'\u7aef\u5e84\u7684\u9a6c\u6b47\u5c14$$many_other_data'`
答案 0 :(得分:1)
文件是字节。你不能在其中存储字符。
特别常见的编码是ASCII。它就像所有那些不同的unicode编码一样。
这些字节本身是无意义的(作为文本)而没有相关的编码来赋予它们意义。
您需要使用与编写文件时使用的编码或查看器相同的编辑器或查看器来查看文件。
答案 1 :(得分:1)
由于你有字节,你需要知道你的编码。有多种方法可以将字节转换为unicode(str.decode
),这取决于字节的编码。
您无法从字节本身获取此信息,有人必须告诉您编码。
虽然,有时你可以做出有根据的猜测:
>>> import chardet
>>> s = '\xe7\x8e\xa9'
>>> chardet.detect(s)
{'confidence': 0.505, 'encoding': 'utf-8'}
>>> s.decode(chardet.detect(s)['encoding'])
u'\u73a9'
>>> print _
玩
现在,您应该在输入python程序后立即将任何字符串从db转换为unicode,以便您的代码完全使用unicode,而不是字节。
然后,您可以像这样编写文件:
import io
with io.open('/tmp/myfile.txt', 'wb', encoding='utf-8') as f:
f.write(u'\u73a9')
f.write('\n')
f.write('random other data 12345...')
答案 2 :(得分:1)
以下是为我工作的代码示例:
with open('foo', 'w+') as f:
f.write('\xe7\x8e\xa9')
并在foo
文件中有:
玩
但是,我用utf-8编码打开foo
,所以显示中文字符而不是Unicode值。
我用vim和gedit进行了测试,效果很好。
也许您应该提供输出文件的类型,因此我们可以更具体。
修改强>
我现在看到了问题。您在编写字符串时使用了%r
标志。您应该使用%s
(并再次启用编码)。
以下是工作示例:
>>> a = u'\u7aef\u5e84\u7684\u9a6c\u6b47\u5c14'
>>> f = open('tmp', 'w')
>>> a = a.encode('utf-8')
>>> f.write('\t$$%r$$other_data\n'%a)
>>> f.write('\t$$%s$$other_data\n'%a)
>>> f.close
结果是:
$$'\xe7\xab\xaf\xe5\xba\x84\xe7\x9a\x84\xe9\xa9\xac\xe6\xad\x87\xe5\xb0\x94'$$other_data
$$端庄的马歇尔$$other_data
请准备this answer以获取有关%r和%s之间差异的参考。
希望有所帮助。