保存文件名中包含俄文字母的文件

Save file with Russian letters in the file name

我有这个 Python 脚本,它获取网页信息,然后将此信息保存到文本文件中。但是这个文本文件的名字时常变化,有时会变成西里尔字母,有时会变成韩文字母。

问题是,假设我试图用名称“бореиская”保存文件,那么当我在 Windows 中查看它时,这个名称会显得很奇怪。

我猜我需要在某些地方更改一些编码。但是名称被发送到 open() 函数:

server = "бореиская"
file = open("eu_" + server + ".lua", "w")

早些时候,我从一个已经包含所有名称的数组中获取服务器变量。

但如前所述,在Windows中,名字中​​出现了一些非常奇怪的字符。

在 Windows 中,您可能必须将文件名编码为某些 cp125x 编码,但我不知道是哪一个 - 可能 cp1251.

filename = "eu_" + server + ".lua"

filename = filename.encode('cp1251')

file = open(filename, 'w')

在Linux中你应该使用utf-8

I'm viewing it in windows. ...Using python 2.7

在 Windows 上使用 Unicode 文件名。 Python 可以在那里使用 Unicode API。

不要在字节串文字中使用非 ascii 字符(在 Python 3 上明确禁止)。

  • 使用 Unicode 文字 u'' 或在模块顶部添加 from __future__ import unicode_literals
  • 确保编码声明 (# -*- coding: utf-8 -*-) 正确,即您的 IDE/editor 使用指定的编码来保存您的 Python 来源
#!/usr/bin/env python
# -*- coding: utf-8 -*-

server = u"бореиская"
with open(u"eu_{server}.lua".format(**vars()), "w") as file:
    ...

tl;博士

始终使用 Unicode 字符串作为文件名和路径。例如:

io.open(u"myfile€.txt")
os.listdir(u"mycrazydirß")

你的情况:

server = u"бореиская"
file = open(u"eu_" + server + ".lua", "w")

我假设 server 将来自另一个位置,因此您需要确保它已正确解码为 Unicode 字符串。参见 io.open()

说明

Windows

Windows 使用 UTF-16 存储文件名。 Windows i/o API 和 Python 隐藏了这个细节,但需要 Unicode 字符串,否则字符串必须使用正确的 8 位代码页。

Linux

文件名可以由任何字节串、任何编码组成,只要它不是 ASCII“.”。要么 ”..”。由于每个系统用户都可以有自己的编码,你真的不能保证一个用户使用的编码与另一个用户使用的编码相同。 locale 用于配置每个用户的环境。用户的终端编码也需要和编码一致才能保持一致。

最好的希望是用户没有更改他们的区域设置并且所有应用程序都使用相同的区域设置。例如,默认语言环境可能是:en_GB.UTF-8,这意味着文件和文件名的编码应该是 UTF-8。

当 Python 遇到 Unicode 文件名时,它将使用用户的语言环境来 decode/encode 文件名。编码后的字符串将直接传递给内核,这意味着您可能会幸运地使用 "UTF-8" 文件名。

OS X

OS X 的文件名始终采用 UTF-8 编码,与用户的语言环境无关。因此,文件名应该是 Unicode 字符串,但可能会在用户的语言环境中进行编码并进行翻译。由于大多数用户的语言环境是 *.UTF-8,这意味着您实际上可以传递 UTF-8 编码字符串或 Unicode 字符串。

综述

为了获得最佳的跨平台兼容性,请始终使用 Unicode 字符串,因为在大多数情况下它们会被转换为正确的编码。实际上只有 Linux 最含糊不清,因为某些应用程序可能会选择忽略默认区域设置,或者用户可能已将其区域设置更改为非 UTF-8 版本。