Python,Windows,Ansi - 再次编码

xph*_*xph 8 python windows ansi character-encoding

你好,

即使我真的尝试过......我对Python,Windows,Ansi字符编码感到困惑和有点绝望.我需要帮助,认真地......在网上搜索最近几个小时没有任何帮助,它只会让我发疯.

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

...我不能将Umlaute (äöü)写入播放列表文件.

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

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

我已经尝试了很多种编码和解码方法,我不能在这里列出所有这些...哎呀,我甚至无法分辨出我半小时前试过的设置.我在网上,这里和其他地方找到了代码,它似乎可以用于某些目的.不是我的.

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

如果我将文件格式更改回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行代码用于其他函数或类,我将键入它们.如果有一个处理这些东西的模块,请告诉我!我买了!任何有用的东西都会被测试.

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

映入眼帘!

Tho*_*zco 20

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

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吧.如果它已经编码了,请不要触摸它(如果编码不是您想要的编码decode,那么encode它就是它!).

脚本开头的一个神奇的评论,比如# - - coding:iso-8859-1 -在这里什么都不做(虽然它对于提到的元数据并允许其中的字符有用...)

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

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

Python 3可能是unicode和编码方面的一个重大更新,但这并不意味着Python 2.x无法使其工作!

这会解决你的问题吗?

您无法确定,问题可能在于您正在使用的播放器,而不在您的代码中.

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


Glu*_*tor 6

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

\n\n
u\'\xc3\xb1\'.encode(\'mbcs\') -> \'\\xf1\'\n\'\\xf1\'.decode(\'mbcs\') -> u\'\xc3\xb1\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 Windows 上,ANSI 表示当前默认的多字节代码页。对于西欧语言 Windows ISO-8859-1,对于东欧语言 Windows ISO-8859-2)编码的字节字符串以及其他适当语言的其他编码。

\n\n

更多信息请访问:

\n\n

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

\n\n

也可以看看:

\n\n

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

\n