内置函数“ open”用于编码和解码文件名的机制是什么?

敌百虫

我对此有些困惑open我正在运行Windows 10,当我打电话时sys.getfilesystemencoding会得到提示mbcs,如果我将文件名传递open给例如:

open('Meow!.txt')

假设源文件的编码为utf-8。是否使用设置为默认Windows ANSI代码页的open编码对文件名'Meow!.txt'进行mbcs编码?然后将请求传递给OS?

  • 一般来说,open在2.X和str3.X中将文件名传递为Unicode时会发生什么

  • 当文件名bytes在3.X或str2.X中作为对象传递时,会覆盖文件名的默认自动编码吗?

敌百虫

open确切地说,这是使用2.7中的内置功能时内部发生的情况

Python设置了一个常量,该常量命名了文件名的默认编码,该常量被调用Py_FileSystemDefaultEncoding并且随平台而变化。最终,当其值设置为Null时,Python将尝试获取平台的默认编码(如果存在):

 /*bltinmodule.c*/

/* The default encoding used by the platform file system APIs
   Can remain NULL for all platforms that don't have such a concept
*/

    #if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
    const char *Py_FileSystemDefaultEncoding = "mbcs";
    #elif defined(__APPLE__)
    const char *Py_FileSystemDefaultEncoding = "utf-8";
    #else
    const char *Py_FileSystemDefaultEncoding = NULL; /* use default */
    #endif

Py_FileSystemDefaultEncoding使用“ mbcs”(多字节字符集)Windows编码,可以检查Py_FileSystemDefaultEncodingusingsys.getfilesystemencoding()调用的值

Python 2.7文档: sys.getfilesystemencoding()

在Windows NT +上,文件名本机为Unicode,因此不执行任何转换。getfilesystemencoding()仍然返回“ mbcs”,因为这是应用程序在明确希望将Unicode字符串转换为与用作文件名时等效的字节字符串时应使用的编码。

因此,例如,假设一个带有汉字的文件名,为简单起见,我将使用U + 5F08中国象棋CJK作为我要编写的文件名:

>>> f = open(u'\u5F08.txt', 'w')
>>> f
<open file u'\u5f08', mode 'w' at 0x000000000336B1E0>
  • 一般来说,open在2.X和str3.X中将文件名传递为Unicode时会发生什么

这个答案取决于平台。例如,在Windows中,不需要将Unicode字符串转换为任何编码,甚至不需要使用默认文件系统编码“ mbcs”,就可以证明:

>>> f = open(u'\u5F08.txt'.encode('mbcs'), 'w')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 22] invalid mode ('w') or filename: '?.txt'

顺便说一句,即使您使用“ utf-8”编码,也不会获得正确的文件名:

>>> f = open(u'\u5F08.txt'.encode('utf8'), 'w')

如果您在Windows上而不是弈.t​​xt进行检查,这将为您提供弈.txt文件名总之,显然没有Unicode文件名的转换。我认为这条规则也适用由于在2.X中是原始字节字符串,因此Python不会神奇地选择编码**但是我无法验证这一点,并且Python可能会使用“ mbcs”编码进行解码。可以通过使用“ mbcs”代码页字符集之外的字符来验证我是否相信,但这又取决于您的Windows语言环境设置。Windows实现中的底层封装了太多内容。如果有内存,我认为“ mbcs”现在被视为Windows API的遗留物。Python 3.6改用UTF-8,strstrstr

确实,似乎问题是Windows API及其实现的深层问题,而不是Python本身的实现。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

类型(Bash内置函数)的用途是什么?

python的内置open()函数中缓冲的用途是什么?

用于获取当前函数的内置变量

变量名与内置函数冲突

函数调用开销-为什么内置Python内置函数看起来比我的内置函数快?

为什么 fromkeys 是方法而不是内置函数?

为什么内置python zip函数?

为什么Pylint不喜欢内置函数?

为什么自定义函数比内置函数慢?

为什么内联函数的效率比内置函数低?

Python内置模块和内置类型/函数之间的关系是什么?

在Python中为内置函数赋予别名的目的是什么

为什么不能将._doc_属性用于内置函数?

内置函数的__self__为什么返回它所属的内置模块?

用于Python内置函数all和any的Perl吊坠

内置函数diff()可用于MathNet中的矢量?

是否有任何内置的用于排列的 Javascript 函数?

用于检查vec是否包含指定元素的内置函数

用于从列中获取随机值的任何内置函数

如果[是内置函数,而[[是关键字,那么什么是((?

为什么numpy的einsum比numpy的内置函数快?

为什么内置的python sum函数的行为如此?

为什么 Python 内置函数没有显示在 dir() 上

为什么某些内置Python函数只能通过?

如何知道什么是命令、系统调用、bash 内置函数等?

内置函数sum对sum(list,[])有什么作用?

Python内置函数“编译”。它是干什么用的?

什么时候打API vs Django内置函数

为什么熊猫应用比矢量内置函数更快