草庐IT

Python、Windows、Ansi——再次编码

coder 2023-08-22 原文

你好,

即使我真的尝试过...当涉及到 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、Windows、Ansi——再次编码的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  5. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  6. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  7. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

随机推荐