我正在尝试在文件中以bengali语言打印此৷
特定unicode ৷
的十六进制代码为09F7
outFileFd=open('File','wb+')
txt="৷"
outFileFd.write(txt.encode('utf-8')
outFileFd.close()
我收到此错误消息:
SyntaxError: Non-ASCII character '\xe0' in file ./p.py on line 3, but no
encoding declared; see http://www.python.org/peps/pep-0263.html for details.
请提出一些解决方案
答案 0 :(得分:4)
有几个问题:
如果您不提供编码,Python不接受源文件中的非ascii字符。您可以通过以下方式解决此问题:
声明编码(请参阅PEP-0263)。
我通常更喜欢通过确保源文件以适当的字节顺序标记开始来声明编码,除了#!
脚本与#!
标记冲突的情况。
使用转义序列:
txt = "\xe0\xa7\xb7"
当然你可以使用带有unicode字符串的unicode转义(见下文),如
txt = u"\u09f7"
在python 2中,普通字符串是面向字节的。因此编码源已经存在。您可以:
需要声明字符串unicode(python会将其转换为utf-8的源编码)并调用.encode('utf-8')
:
txt = u"৷"
outFileFd.write(txt.encode('utf-8'))
不调用.encode('utf-8')
,因为该字符串已经是utf-8。
txt = "৷"
outFileFd.write(txt)
如果在非unicode字符串上调用.encode
,它将引发异常,因为它会尝试隐式将字符串转换为unicode并显式返回,但隐式转换仅适用于ascii字符串而你的字符串是不
请注意,这是python 2和3的不同之处。在python 3中,未加前缀的字符串是unicode,字节字符串以b
为前缀。
答案 1 :(得分:3)
由于您知道要编写的字符的代码点编号,因此可以在Unicode字符串中使用\u
转义符:
txt=u"\u09F7"
with open('File','wb+') as outFile:
outFile.write(txt.encode('utf-8'))
或者,将编码指令放在文件的顶部:
#! /usr/bin/python
# -*- encoding: utf-8 -*-
并将txt="৷"
更改为txt=u"৷"
,一切都应该正常工作。 (在模块或任何其他不需要#!
行的上下文中,# -*- encoding:
行应该是第一行。)