Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与python和文件系统中的字符串编码混淆_Python_String_File_Unicode - Fatal编程技术网

与python和文件系统中的字符串编码混淆

与python和文件系统中的字符串编码混淆,python,string,file,unicode,Python,String,File,Unicode,我正在学习python。它有一个很好的章节来处理python中的unicode字符串 我只需要澄清我是否正确理解了它。这就是我所理解的 我发现python2.x有str支持普通文本和字节,它有u'…'文字或unicode()用于unicode字符等特殊文本 另一方面,python3.x有str支持unicode文本,因为所有普通文本都是unicode 如果您像s='something'那样编写,那么s既是普通文本,也是python2.x中字节的组合,也是python3.x中unicode文本的组

我正在学习python。它有一个很好的章节来处理python中的unicode字符串

我只需要澄清我是否正确理解了它。这就是我所理解的

我发现
python2.x
str
支持普通文本和字节,它有
u'…'
文字或
unicode()
用于unicode字符等特殊文本

另一方面,
python3.x
str
支持unicode文本,因为所有普通文本都是unicode

如果您像
s='something'
那样编写,那么
s
既是普通文本,也是
python2.x
中字节的组合,也是
python3.x
中unicode文本的组合

现在我还了解到,这些文件的编码太过复杂,以至于无法在磁盘中保存一些东西,我们需要数字,要存储大量字符,我们需要一些编码技术

这就是我们所拥有的

Python3.x
中,所有带有单引号、双引号和三引号字符串的字符串文本都以特定的转换格式编码和解码,以存储在内存中(用于python解释器)

另一方面,为了在磁盘上存储文件内容,操作系统采用某种编码技术来存储不同范围的字符。所以,当我们在文件上写一些东西,并对其进行编码以获得一个特定的代码点,这样它就可以将该代码点保存在内存中,当我们从存储在内存中的文件中提取信息时,这些信息会通过使用与我们之前使用的完全相同的编码技术从这些代码点解码为字符

文件内容以代码点的形式存储在磁盘中,但当我们在文本编辑器中打开文件时,我们会看到这些代码点以字符形式的解码格式

差不多就是这样。这些都是我所理解的正确吗?
此外,如果您有关于unicode的其他信息,我也愿意接受。

您可以阅读unicode指南:

简言之:

两个Python版本都有字节的数据类型和文本的数据类型: 没有普通文本和Unicode文本。只发短信。您应该始终将Unicode字符串用于文本,字节用于二进制数据

文件存储字节 文件总是一个字节序列。如果以文本形式打开文件,Python 3将执行解码。因此,您通常必须指定要使用的编码:
open('file.txt',encoding='utf-8')
。在Python2中使用例如
io.open
这样做是一个好主意

Python源文件包含Unicode文本 对于Python 3,这是规范的一部分:请参阅:

Python将程序文本读取为Unicode代码点

但磁盘上的文件只是字节。同样,Python将这些字节解码为Unicode文本。要确保Python使用正确的编码,必须声明使用的编码与默认编码不同(ASCII用于Python 2,UTF-8用于Python 3)

这还告诉您Python如何处理Unicode字符串文本。源代码是一个Unicode代码点序列,因此字符串由引号之间的代码点组成

另一方面,字节文字应仅包含ASCII字符,这些字符映射到字节0–127。对其他字节使用
\x
转义。使用其他字符可能会引发语法错误

Python 2仅指定字符串文字(和注释)可以使用ASCII以外的其他编码。但是,如果遵循上述约定,您将在字节和unicode字符串中获得预期的字节和代码点

…但文件不存储字节吗? 当然可以。包含Unicode字符序列的文件的概念是一种抽象概念。这种抽象的一种方式是需要声明一种编码,它指定磁盘上Unicode字符和字节序列之间的映射。您的文本编辑器必须使用相同的编码来保存源代码

另一件事是Python规范并没有将Python源文件定义为由编码的Unicode文本组成。但它的指定方式是,在实践中,源文件几乎总是这样一个文本文件。这样做的结果是,与JSON不同,您不能将Python源文件编码为UTF-16

但除此之外,这种抽象非常有效。您可以在文本编辑器中键入(或粘贴)Unicode字符,Python中的字符串将包含正确的字符

test.py

print(unicodedata.name(“⛄"))

print(unicodedata.name)(“投票迁移到编程,因为这个问题太宽泛了,无法给出一个简洁的答案。你几乎是正确的,只是不是操作系统编码文本;Python将字节写入文件系统。如果在Python中,你使用Py2的
io.open()的Py3的
open
以文本模式打开文件
,您可以编写Unicode字符串,这些字符串将由Python编码为给定或默认编码。我的意思是,源代码由操作系统编码,以在辅助存储器上存储为字节。是的,当您使用Python将文本写入文件时,该文本由Python本身编码,以存储为字节。允许您获得ython源代码是文本,但我不确定说“Python源文件是Unicode文本”是否正确(您可以轻松地将其转换为Unicode文本,但也可以将其转换为AST或字节码)。@J.F.Sebastian-hmm可能是一种简化。但请注意(1)
b”☃"
是一个语法错误,如果您的文件包含无效字节,它将不会加载。建议Python文件将被解释为Unicode文本。更正-它将加载,但我不知道它将如何解释。我看不出您期望的是什么☃“
以证明。不建议这样做
# python 2 (without from future import ...):
bytes = "abcd"
text  = u"abcd"
# python 3:
bytes = b"abcd"
text  = "abcd"