你好,
即使我真的尝试过...当涉及到 Python、Windows、Ansi 和 时,我仍然陷入困境并且有些绝望字符编码。我真的需要帮助……过去几个小时在网上搜索没有任何帮助,它只会让我发疯。
我是 Python 的新手,所以我几乎不知道发生了什么。我即将学习这门语言,所以我的第一个程序(快 完成了)应该会自动从包含 mp3 的给定文件夹生成音乐播放列表。这工作得很好,除了一个问题......
...我无法将元音 (äöü) 写入播放列表文件。
在我为 sys.argv
中的“错误编码” 数据找到解决方案后,我能够处理该问题。从 MP3 中读取元数据时,我使用某种简单的字符替换来去除所有那些国际特殊字符,例如法国口音或这个疯狂的斯堪的纳维亚语 “o” 中的斜杠 < em>(我什至不知道如何打字...)。一切都很好。
但我想至少将提到的 Umlaute 写入播放列表文件,这些字符在德国真的很常见。与元数据不同,在元数据中我不关心一些丢失的字符或拼写错误的单词,这是相关的 - 因为现在我正在写文件的路径。
我已经尝试了很多不同的编码和解码方法,我无法在这里一一列举。哎呀,我什至无法分辨我半小时前尝试了哪些设置。我在网上、这里和其他地方找到了代码,它们似乎可以用于某些目的。不适合我的。
我认为棘手的部分是:问题似乎是我需要写入的文件的 Ansi 调用格式。正确 - 我实际上需要这个 Ansi-stuff。大约两个小时前,我实际上设法将我想要的任何内容写入 UFT-8 文件。像魅力一样工作......直到我意识到我的播放器 (Winamp,旧版本) 不知何故不能与那些 UTF-8 播放列表文件一起工作。它无法解析路径,即使它在我的编辑器中看起来正确。
如果我将文件格式改回 Ansi,包含特殊字符的路径会损坏。我只是在猜测,但如果 Winamp 将此 UTF-8 文件读取为 Ansi,那将导致我现在遇到的问题。
所以...
- 我必须在路径中写 äöü,否则它不会工作
- 它必须是一个 ANSI“编码”文件,否则它将无法工作
line.write(str.decode('utf-8'))
破坏了文件的功能- 脚本开头的神奇注释,如
# -*- coding: iso-8859-1 -*-
在这里什么也没做 (尽管它对提到了元数据和其中允许的字符...) - 哦,我正在使用 Python 2.7.3。第三方模块依赖,你懂的……
有没有人可以指导我走出这个编码 hell ?欢迎任何帮助。如果我需要 500 行代码用于其他函数或类,我会输入它们。如果有处理此类问题的模块,请告诉我!我会买它!任何有用的东西都会被测试。
感谢阅读,感谢评论,
问候!
最佳答案
如评论中所述,您的问题不是很具体,因此我会尝试为您提供一些有关字符编码的提示,看看您是否可以将这些提示应用于您的具体情况!
Unicode 和编码
这是一个关于编码的小入门。基本上,在 Python 中有两种表示文本的方法:
-
unicode
.你可以认为unicode
是最终的编码,你应该努力在任何地方使用它。在 Python 2.x 源文件中,unicode
字符串看起来像u'some unicode'
. -
str
.这是编码文本 - 为了能够阅读它,您需要知道编码(或猜测)。在 Python 2.x 中,这些字符串看起来像'some str'
.
这在 Python 3 中发生了变化(unicode
现在是 str
并且 str
现在是 bytes
)。
结果如何?
通常,确保您的代码使用 unicode
非常简单用于执行,并使用 str
对于 I/O:
- 您收到的所有内容都是编码,因此您可以
input_string.decode('encoding')
将其转换为unicode
. - 你需要输出的所有东西都是unicode但需要编码,所以你做
output_string.encode('encoding')
.
最常见的编码是 cp-1252
在 Windows 上(在美国或欧盟系统上),以及 utf-8
在 Linux 上。
将此应用于您的案例
我必须在路径中写 äöü,否则它不会工作
Windows native 使用 unicode
对于文件路径和名称,所以你实际上应该总是使用 unicode
对于那些。
它必须是一个 ANSI“编码”文件,否则将无法工作
当你写入文件时,一定要始终通过 output.encode('cp1252')
运行你的输出(或者 whatever encoding ANSI 将在您的系统上)。
像 line.write(str.decode('utf-8')) 这样的东西破坏了文件的功能
现在你可能已经意识到:
- 如果
str
确实是str
例如,Python 将尝试将其转换为unicode
使用utf-8
编码,然后尝试再次编码(可能在ascii
中)以将其写入文件 - 如果
str
实际上是一个unicode
例如,Python 将首先对其进行编码(可能在ascii
中,这可能会崩溃),然后才能对其进行解码。
底线是,你需要知道 str
是unicode
,你应该 encode
它。如果它已经编码,请不要触摸它(或者 decode
然后 encode
如果编码不是你想要的!)。
脚本开头的神奇注释,如 # -- coding: iso-8859-1 -- 在这里什么也没做(尽管它对提到的元数据和允许的字符很有帮助在里面...)
不足为奇,这只是告诉 Python 应该使用什么编码来读取源文件,以便正确识别非 ASCII 字符。
哦,我正在使用 Python 2.7.3。第三方模块依赖,你懂的……
Python 3 可能是 unicode 和编码方面的重大更新,但这并不意味着 Python 2.x 无法使其工作!
这会解决您的问题吗?
你不能确定,有可能问题出在你使用的播放器上,而不是你的代码上。
输出后,您应该确保脚本的输出可以使用引用工具(例如 Windows 资源管理器)读取。如果是,但播放器还是打不开,你应该考虑升级到新版本。
关于Python、Windows、Ansi——再次编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14079343/