【问题标题】:Which "platform-dependent" encodings does `open()` default to, on major platforms?在主要平台上,`open()` 默认使用哪些“平台相关”编码?
【发布时间】:2016-01-14 06:45:13
【问题描述】:

根据手册,open()的默认输入输出编码是“平台相关”,usuallylocale.getpreferredencoding()给出。但是这些平台相关的默认值究竟(或大约)是什么?

编辑:一个有用的答案可能是配置列表的形式(可能是操作系统和一些语言/本地化设置的组合)和生成的默认编码。

我并不期待一个完整的参考,但我想知道当我的一个学生偶然发现我可以顺利运行的代码时会发生什么,以及需要考虑哪些因素(我的盒子默认为 @987654329 @)。理想情况下,我可以提前说“如果你的系统设置为 X,你应该做 Y”。

我查看了getpreferredencoding()the source 并且可以看到检查了许多环境变量,但是我没有要手动测试的不同机器的动物园——而且我没有了解设置所有这些环境变量的因素。我的学生来自不同的国家(但主要是荷兰人),他们使用 PC、Mac 和 Chromebook。有没有人可以提供我可以期待的概述?

【问题讨论】:

  • "关于我可以运行的代码" -- 如果它是 Python 源代码,那么告诉你的学生使用encoding declaration: # -*- coding: utf-8 -*- 如果他们的源代码使用非 ascii 文字(utf-8 是 Python 3 中的默认值,因此编码声明是可选的)。
  • 不,正如问题所说,这是关于使用open() 读取文件而不指定编码的代码。
  • 如果您不知道字符编码,请使用二进制模式'rb' 读取文件。否则只能猜测编码(chardet 模块)。
  • @JF,我知道如何处理文件及其编码。请阅读这个问题,不要向我解释这个世界。多年来,我们一直在这个网站上相遇,通常是在 Python 问题上。
  • @alexis 在 Windows 上,我认为它是系统代码页 (list)。给定一个采用这些编码之一的文本文件,很难判断使用的是什么编解码器。您应该期望它是 randomimpossible to guess.

标签: python unicode character-encoding localization


【解决方案1】:

我认为在 Windows 上它将是当前的代码页,通常标记为 ANSI。如果您指定名称 'mbcs',这就是您在 Windows 上获得的编解码器。

但是出于大多数实际目的,您应该假设文本文件只会有一些随机编码。我认为深入研究locale.getpreferredencoding() 的细节没有用处。如果我没记错的话,无论如何您都可以在脚本中覆盖该默认值。

我不知道您将如何处理这些文本,但如果您要获取所有这些不同编码的文件,请知道is 没有reliable 找出该编码的方式。

如果您想通过反复试验一个一个地检查这些文件,然后继续,但我会通过告诉学生以一组编码提交来避免这个问题,例如。 UTF-8。使用open(blabla, 'w', encoding='utf-8') 打开文件很容易。

【讨论】:

  • Windows 使用启发式来推断编码,但 Python 使用独立于文件内容的“默认值”。我不是(问题不是)在任何基于内容的推理之后。
  • 我要用这些信息做的是,我希望能够说“在 X 条件下,你可以期望 UTF-8 是编码,但如果你的计算机像 Y 那么你会得到别的东西。”除了可移植性,编码参数是可选的,所以我们应该知道什么时候需要使用它。让我感到困扰的是,我必须教这些东西,却不知道我的学生能期待什么。 (默认是ascii的时候就已经很简单了——为什么不能变成所有人的“utf8”呢?)
  • 另外,我认为也是系统代码页,但我不确定情况是否总是如此;正如我在问题中提到的那样,甚至可能连getpreferredencoding() 都没有得到遵守。所以我希望得到一些基于参考资料或丰富经验的东西。
  • @alexis 在打开非 ASCII 字符的文本文件时,您几乎总是需要使用 encoding 参数。至于默认,“它依赖于平台,你不能依赖它具有一定的价值”是一个很好的解释。
  • 这归结为“您的问题不需要回答”。即使你是对的(你可能是:-)),我仍然希望知道答案......
猜你喜欢
  • 1970-01-01
  • 2012-03-07
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多