14

你好呀,

即使我真的尝试过......当谈到PythonWindowsAnsi字符编码时,我陷入了困境并且有些绝望。我需要帮助,说真的......过去几个小时在网上搜索没有任何帮助,它只会让我发疯。

我是 Python 新手,所以我几乎不知道发生了什么。我即将学习这门语言,所以我的第一个程序几乎完成了,它应该自动从包含 mp3 的给定文件夹生成音乐播放列表。这工作得很好,除了一个问题......

...我无法将元音变音(äöü)写入播放列表文件。

在我找到“错误编码”数据的解决方案后,sys.argv我能够处理这个问题。从 MP3 中读取元数据时,我使用某种简单的字符替换来摆脱所有那些国际特殊字符,例如法语口音或带有斜线的疯狂斯堪的纳维亚语“o” (我什至不知道如何键入它...)。一切都好。

但我想至少将提到的元音变音写到播放列表文件中,这些字符在德国真的很常见。与元数据不同,我不关心一些丢失的字符或拼写错误的单词,这是相关的 - 因为现在我正在编写文件的路径。

我已经尝试了很多不同的编码和解码方法,我无法在这里全部列出.. 哎呀,我什至无法说出半小时前我尝试了哪些设置。我在网上、这里和其他地方找到了似乎可以用于某些目的的代码。不适合我的。

我认为棘手的部分是:问题似乎是我需要编写的文件的Ansi格式。正确 - 我实际上需要这个 Ansi-stuff。大约两个小时前,我实际上设法将我想要的任何内容写入 UFT-8 文件。像魅力一样工作......直到我意识到我的播放器(Winamp,旧版本)不知何故不适用于那些 UTF-8 播放列表文件。即使它在我的编辑器中看起来正确,它也无法解析路径。

如果我将文件格式更改回 Ansi,则包含特殊字符的路径会损坏。我只是猜测,但如果 Winamp 将此 UTF-8 文件读取为 Ansi,那将导致我现在遇到的问题。

所以...

  1. 我必须在路径中写 äöü,否则将无法正常工作
  2. 它必须是 ANSI-“编码”文件,否则将无法工作
  3. line.write(str.decode('utf-8'))诸如破坏文件功能之类的事情
  4. 脚本开头的神奇注释在# -*- coding: iso-8859-1 -*-这里什么都不做(尽管它对提到的元数据和其中允许的字符很有帮助......)
  5. 哦,我正在使用 Python 2.7.3。第三方模块依赖,你知道的...

有没有人可以引导我走出这个编码地狱?欢迎任何帮助。如果我需要 500 行代码用于其他函数或类,我会输入它们。如果有处理这些东西的模块,请告诉我!我会买的!任何有用的东西都会被测试。

感谢您的阅读,感谢您的任何评论,

问候!

4

3 回答 3

28

正如评论中提到的,你的问题不是很具体,所以我会尝试给你一些关于字符编码的提示,看看你是否可以将这些应用于你的具体情况!

Unicode 和编码

这是一个关于编码的小入门。基本上,有两种方法可以在 Python 中表示文本:

  • unicode. 你可以认为这unicode是终极编码,你应该努力在任何地方使用它。在 Python 2.x 源文件中,unicode字符串看起来像u'some unicode'.
  • str. 这是编码文本 - 为了能够阅读它,您需要知道编码(或猜测它)。在 Python 2.x 中,这些字符串看起来像'some str'.

这在 Python 3 中发生了变化(unicode现在strstr现在bytes)。

怎么玩?

通常,确保您的代码unicode用于其执行和str用于 I/O 是非常简单的:

  • 收到的所有内容都经过编码,因此您input_string.decode('encoding')需要将其转换为unicode.
  • 您需要输出的所有内容都是 unicode,但需要进行编码,因此您可以使用output_string.encode('encoding').

最常见的编码是cp-1252在 Windows(在美国或欧盟系统上)和utf-8Linux 上。

将此应用于您的案例

我必须在路径中写 äöü,否则将无法正常工作

Windows 本机使用unicode文件路径和名称,因此您实际上应该始终使用unicode它们。

它必须是 ANSI-“编码”文件,否则将无法工作

当您写入文件时,请确保始终通过output.encode('cp1252')(或系统上的任何编码 ANSI)运行您的输出。

line.write(str.decode('utf-8')) 之类的东西破坏了文件的功能

到现在为止,您可能已经意识到:

  • 如果str确实是一个str实例,Python 将尝试将其转换为unicode使用utf-8编码,但随后尝试再次对其进行编码(可能在 中ascii)以将其写入文件
  • 如果str实际上是一个unicode实例,Python 将首先对其进行编码(可能在 中ascii,并且可能会崩溃)然后才能对其进行解码。

底线是,你需要知道如果strunicode,你应该encode知道。如果它已经编码,请不要触摸它(如果编码不是您想要的,则不要触摸它!)decodeencode

脚本开头的神奇注释,如 # - - coding: iso-8859-1 - - 在这里什么都不做(尽管它对提到的元数据和其中允许的字符很有帮助......)

不足为奇,这只告诉 Python 应该使用什么编码来读取源文件,以便正确识别非 ascii 字符。

哦,我正在使用 Python 2.7.3。第三方模块依赖,你知道的...

Python 3 可能是 unicode 和编码方面的一次重大更新,但这并不意味着 Python 2.x 不能让它工作!

这会解决你的问题吗?

您不能确定,问题可能出在您正在使用的播放器上,而不是在您的代码中。

一旦你输出它,你应该确保你的脚本的输出是可以使用参考工具(比如 Windows 资源管理器)读取的。如果是,但播放器仍然无法打开它,您应该考虑更新到较新的版本。

于 2012-12-29T11:58:47.090 回答
5

在 Windows 上,有一种称为mbcs的特殊编码可用,它在当前默认的 ANSI 代码页和 UNICODE 之间进行转换。例如在西班牙语 PC 上:

u'ñ'.encode('mbcs') -> '\xf1'
'\xf1'.decode('mbcs') -> u'ñ'

在 Windows 上,ANSI 表示当前默认的多字节代码页。对于西欧语言 Windows ISO-8859-1,对于东欧语言 Windows ISO-8859-2) 编码字节字符串和其他语言的其他编码(视情况而定)。

更多信息请访问:

https://docs.python.org/2.4/lib/standard-encodings.html

也可以看看:

https://docs.python.org/2/library/sys.html#sys.getfilesystemencoding

于 2016-05-11T16:34:14.903 回答
0

# -*- coding注释声明源代码的字符编码(因此是字节字符串文字,如'abc')。

假设“播放列表”是指m3u文件,那么根据本规范,您可能会受到您正在使用的 mp3 播放器软件的支配。这个规范只说文件包含文本,没有提到什么字符编码。

我个人观察到各种 mp3 编码软件会对 mp3 元数据使用不同的编码。有些使用 UTF-8,有些使用 ISO-8859-1。因此,您可能必须允许在配置中指定编码并将其保留。

于 2012-12-29T07:11:37.650 回答