我有这个Python脚本,它获取网页的信息,然后将此信息保存到文本文件中。但是这个文本文件的名称有时会发生变化,有时会变成西里尔字母,有时会变成韩文字母。
问题在于,我正在尝试使用名称“бореиская”保存文件,然后当我在Windows中查看时,名称将显得非常奇怪。
我猜我需要在某些地方更改一些编码。但该名称正被发送到open()
函数:
server = "бореиская"
file = open("eu_" + server + ".lua", "w")
我早些时候从已经包含所有名称的数组中获取服务器变量。
但如前所述,在Windows中,名称会出现一些非常奇怪的字符。
答案 0 :(得分:3)
始终将Unicode字符串用于文件名和路径。 E.g:
io.open(u"myfile€.txt")
os.listdir(u"mycrazydirß")
在你的情况下:
server = u"бореиская"
file = open(u"eu_" + server + ".lua", "w")
我认为server
将来自其他位置,因此您需要确保将其正确解码为Unicode字符串。请参阅io.open()
。
Windows使用UTF-16存储文件名。 Windows i / o API和Python隐藏了这个细节但需要Unicode字符串,否则字符串必须使用正确的8位代码页。
文件名可以由任何字节串组成,只要不是ASCII"。或" .."。由于每个系统用户都可以拥有自己的编码,因此您实际上无法保证一个用户使用的编码与另一个用户相同。 locale
用于配置每个用户的环境。用户的终端编码也需要匹配编码以保持一致性。
可以希望的最好的是用户没有改变他们的语言环境,并且所有应用程序都使用相同的语言环境。例如,默认语言环境可能是:en_GB.UTF-8
,表示文件和文件名的编码应为UTF-8。
当Python遇到Unicode文件名时,它将使用用户的语言环境来解码/编码文件名。编码的字符串将直接传递给内核,这意味着您可以使用" UTF-8"文件名。
OS X的文件名始终采用UTF-8编码,无论用户的语言环境如何。因此,文件名应该是Unicode字符串,但可以在用户的语言环境中进行编码并进行翻译。由于大多数用户的语言环境都是*.UTF-8
,这意味着您实际上可以传递UTF-8编码的字符串或Unicode字符串。
为了获得最佳的跨平台兼容性,请始终使用Unicode字符串,因为在大多数情况下,它们将被转换为正确的编码。它实际上只是Linux中含糊不清的,因为有些应用程序可能会选择忽略默认语言环境,或者用户可能已将其语言环境更改为非UTF-8版本。
答案 1 :(得分:1)
我在Windows中查看它。 ...使用python 2.7
在Windows上使用Unicode文件名。 Python可以在那里使用Unicode API。
不要在bytestring文字中使用非ascii字符(在Python 3中明确禁止)。
u''
或在模块顶部添加from __future__ import unicode_literals
# -*- coding: utf-8 -*-
)正确,即您的IDE /编辑器使用指定的编码来保存您的Python源#!/usr/bin/env python
# -*- coding: utf-8 -*-
server = u"бореиская"
with open(u"eu_{server}.lua".format(**vars()), "w") as file:
...
答案 2 :(得分:-1)
在Windows中,您必须将文件名编码为某些cp125x
编码,但我不知道哪一个 - 可能是cp1251
。
filename = "eu_" + server + ".lua"
filename = filename.encode('cp1251')
file = open(filename, 'w')
在Linux中,您应该使用utf-8