Python、Windows、Ansi——再次编码

标签 python windows character-encoding ansi

你好,

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

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

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

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

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

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

我认为棘手的部分是:问题似乎是我需要写入的文件的 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。第三方模块依赖,你懂的……

有没有人可以指导我走出这个编码 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 中,这可能会崩溃),然后才能对其进行解码。

底线是,你需要知道 strunicode ,你应该 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/

相关文章:

python - 单元测试中的设置部分似乎被忽略

linux - Windows 10 上的 Bash linux (WSL) - 当我在其中移动某些内容时,终端/控制台不刷新文件夹/文件

php - 无法在 mysql 上插入 utf8 字符(使用 utf8 排序规则、字符集和名称集)

Python 多处理 : Only one process is running

python - 映射声波涉及哪些技术?

c++ - 如何在运行时添加代码

php - 使用 PHP 从 MySQL 数据库中获取特殊字符

html - Firefox 不显示 CP437

python - 如何使用 Python Selenium 在网站上的内部滚动条上滚动?

windows - GDI 已经加速。有谁知道这是什么时候发生的?