Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python脚本在Windows XP上创建的文件名中编码错误_Python_Windows_Unicode_Encoding_Utf 8 - Fatal编程技术网

Python脚本在Windows XP上创建的文件名中编码错误

Python脚本在Windows XP上创建的文件名中编码错误,python,windows,unicode,encoding,utf-8,Python,Windows,Unicode,Encoding,Utf 8,我的Python脚本在Windows XP下创建了一个xml文件,但该文件没有使用西班牙语字符(如“ñ”或一些重音字母)进行正确编码 首先,使用以下代码从excel外壳读取文件名,我用于读取excel文件xlrd库: filename = excelsheet.cell_value(rowx=first_row, colx=5) 然后,我尝试了一些编码,但没有成功地生成具有正确编码的文件: filename = filename[:-1].encode("utf-8") filename =

我的Python脚本在Windows XP下创建了一个xml文件,但该文件没有使用西班牙语字符(如“ñ”或一些重音字母)进行正确编码

首先,使用以下代码从excel外壳读取文件名,我用于读取excel文件xlrd库:

filename = excelsheet.cell_value(rowx=first_row, colx=5)
然后,我尝试了一些编码,但没有成功地生成具有正确编码的文件:

filename = filename[:-1].encode("utf-8")
filename = filename[:-1].encode("latin1")
filename = filename[:-1].encode("windows-1252")
使用“windows-1252”,我得到了一个错误的编码,字母“ñ”、“í”和“é”。例如,我得到了BAJO ARAGÓNÓu Alcañiz.xml而不是BAJO ARAGÓNÓu Alcañiz.xml

首先感谢您的帮助

, 如果没有,请阅读-

现在,“latin-1”应该适用于Windows下的西班牙语编码——tehr有两个假设:您试图“编码”到任一编码的字符串不是Unicdoe字符串,而是已经在某种编码中了。然而,比起奇怪的角色,它更可能给你一个UnicodeDecodeError,但它可能在某些情况下起作用

更可能的情况是,您正在使用windows提示符(也称为“CMD”)检查文件- 嗯,出于某种原因,Microsoft Windows确实为系统使用了两种不同的编码——一种来自“本机”Windows程序内部,应该与latin1兼容;另一种用于传统DOS程序,它将命令提示符放在其中。对于葡萄牙语,第二种编码是“cp852”(环顾四周,cp852没有定义“ñ”-但cp850有定义)

所以,这种情况发生了:

>>> print u"Aña".encode("latin1").decode("cp850")
A±a
>>> 
因此,如果您希望文件名在DOS提示符下正确显示,则应使用“CP850”对其进行编码-如果您希望文件名在Windows程序中正确显示,请使用“cp1252”(或“latin1”或“iso-8859-15”对其进行编码-它们几乎相同,可以使用“€”符号

当然,与其尝试猜测和挑选一个看起来不错的,并且如果有人在挪威、俄罗斯或aa Posix系统中运行您的程序就会失败的程序,您应该这样做

import sys
encoding = sys.getfilesystemencoding()

(这将为您返回上述其中一个文件名-同样,如果文件名是从Windows程序而不是从DOS shell中显示的,则看起来会正确)

您应该使用unicode字符串作为文件名。通常操作系统支持包含任意unicode字符的文件名。因此,如果您这样做:

fn = u'ma\u00d1o'  # maÑo
f = open(fn, "w")
f.close()
f = open(fn, "r")
f.close()
它应该可以正常工作。当你列出文件所在目录的内容时,你在终端上看到的是另一件事。如果终端的编码是UTF-8,你会看到文件名maño,但是如果编码是iso-8859-1,你会看到maÃo。但是,即使你看到这些奇怪的字符,你也应该能够看到e以如上所述从python打开文件

总之,不要对的输出进行编码

filename = excelsheet.cell_value(rowx=first_row, colx=5)
相反,请确保它是unicode字符串


阅读的Unicode文件名部分会对您有所帮助。

在Windows中,文件系统使用UTF-16,因此不需要显式编码。只需使用Unicode字符串作为文件名,并确保声明源文件的编码


此外,例如,尽管我的美国Windows系统的
cp437
编码不支持
Ó
,但我的控制台字体支持该字符,并且在控制台上仍能正确显示。控制台支持Unicode,但非Unicode程序只能读/写代码页字符。

尝试您的答案时,我发现一个错误st解决方案,将我的脚本从Python2.7移植到Python3.3,移植我的代码的原因是Python3默认在Unicode中工作

我不得不在代码中做一些小改动,导入xlrd库(以前我必须安装xlrd3):

此外,我必须使用str而不是encode()将内容从“bytes”转换为“string”


现在,我的脚本工作正常,在Windows XP上生成的文件没有奇怪的字符。

文件系统支持unicode吗?(尝试在资源管理器中创建一个带有unicode chr的文件)噢,对不起,对
.encode()
。尝试
unicode(文件名)
?您是否尝试使用
chardet
猜测编码?我认为这不是真正的跨平台。Unix文件名是字节字符串。在Unix中运行时使用
unicode
文件名会导致应用默认编码(ASCII)。但是,名为
u'ma\u00d1o'.encode('UTF-8')的文件
在Unix下完全正常。
# coding: utf8
with open(u'BAJO ARAGÓN_Alcañiz.xml','w') as f:
    f.write('test')
import xlrd3 as xlrd
filename = str(filename[:-1])