3

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

首先,使用以下代码从 excel shell 中读取文件名,我用它来读取 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_Alcañiz.xml而不是BAJO ARAGÓN_Alcañiz.xml

在此先感谢您的帮助

4

4 回答 4

1

您应该使用 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。但是即使您看到这些奇怪的字符,您也应该能够如上所述从 python 打开文件。

总之,不要编码的输出

filename = excelsheet.cell_value(rowx=first_row, colx=5)

而是确保它是一个 unicode 字符串。

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

于 2012-10-23T16:39:58.163 回答
1

尝试你的答案我找到了一个快速的解决方案,从 Python 2.7 到 Python 3.3 移植我的脚本,移植我的代码的原因是 Python 3 默认以 Unicode 工作。

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

import xlrd3 as xlrd

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

filename = str(filename[:-1])

现在,我的脚本完美运行,并且在 Windows XP 上生成了没有奇怪字符的文件。

于 2012-10-24T08:37:13.630 回答
0

首先,如果您还没有,请阅读http://www.joelonsoftware.com/articles/Unicode.html -

现在,“latin-1”应该适用于 Windows 下的西班牙语编码 - 有两个假设:您尝试“编码”为任一编码的字符串不是 Unicdoe 字符串,但已经在某些编码中。然而,与奇怪的字符相比,它更有可能给你一个 UnicodeDecodeError ,但它可能在某些极端情况下工作。

更有可能的情况是您正在使用 windows Prompt AKA '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" - 它们几乎相同,给出或采用“€”符号)

当然,不要试图猜测并选择一个看起来不错的,如果有人在挪威、俄罗斯或 a Posix 系统中运行你的程序就会失败,你应该这样做

import sys
encoding = sys.getfilesystemencoding()

(这应该为您返回上述之一 - 再次,如果从 Windows 程序而不是 DOS shell 看起来文件名看起来正确)

于 2012-10-23T16:39:35.230 回答
0

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

# coding: utf8
with open(u'BAJO ARAGÓN_Alcañiz.xml','w') as f:
    f.write('test')

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

于 2012-10-23T17:41:03.930 回答