我在Python2.7中遇到unicode问题。问题是我从数据库获取了一些数据并将其存储在一个名为country的变量中,其值为“Espa \ xf1a”。
如果我转到shell并写下以下内容:
>>>country
>>>u"Espa\xf1a"
>>>print country
>>>España
没关系。没问题。当我尝试按如下方式创建名为España.txt的文件时出现问题:
>>> country = u"Espa\xf1a"
>>> file = "%s.txt" % country
>>> file
u'Espa\xf1a.txt'
>>> print file
España.txt
>>> os.system("touch %s" % file)
Traceback (most recent call last):
File "<console>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in position 10: ordinal not in range(128)
我不知道为什么会这样。谁能帮助我?提前谢谢!
答案 0 :(得分:1)
很可能是您的操作系统不允许您创建文件。不要使用touch来创建文件,而是尝试使用python方法。
f = open(file, 'w')
...
f.close()
我假设您正在尝试写入该文件,并且您希望该文件名为“España.txt”。
答案 1 :(得分:1)
os.system("touch %s" % file)
POSIX命令行和文件系统是一个基于字节的本地环境,那里没有Unicode字符串。非ASCII字符使用某种编码编码为文件名和命令,这些编码因系统而异(尽管在现代Linux上它通常是UTF-8)。
sys.getfilesystemencoding()
将为您提供Python对本地文件系统中正在使用的编码的最佳猜测(如果您安装其他文件系统,所有投注均已关闭),这些变量可能来自希望在环境中定义的变量。
你永远不应该在命令中调用os.system
包含变量。如果变量中存在意外字符,则它们最终会执行任意命令,从而带来灾难性的安全后果。
您可以使用subprocess.call(['touch', filename.encode(sys.getfilesystemencoding())])
之类的接口来处理必要的参数转义,但一般情况下,您应该避免为可以直接从Python执行的touch
等任何内容启动外部命令。
例如:
open(filename, 'wb').close()
(当您open
为Unicode文件名时,Python会根据您的名称对默认文件系统编码进行编码。)
答案 2 :(得分:0)
试试这个:print ("Espa\u00F1a")
。那应该打印España
。
答案 3 :(得分:0)
尝试:
os.system("touch %s" % file.encode('utf-8'))