Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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_Python 3.x_Character Encoding_Python 2.x_Python Unicode - Fatal编程技术网

Python默认字符串编码

Python默认字符串编码,python,python-3.x,character-encoding,python-2.x,python-unicode,Python,Python 3.x,Character Encoding,Python 2.x,Python Unicode,Python何时、何地以及如何隐式地将编码应用于字符串或隐式转码(转换) 那些“默认”(即隐含)编码是什么 例如,编码是什么: 字符串字面值 s = "Byte string with national characters" us = u"Unicode string with national characters" 当类型转换为Unicode和从Unicode转换时,字节字符串的数量 data = unicode(random_by

Python何时、何地以及如何隐式地将编码应用于字符串或隐式转码(转换)

那些“默认”(即隐含)编码是什么

例如,编码是什么:

  • 字符串字面值

      s = "Byte string with national characters"
      us = u"Unicode string with national characters"
    
  • 当类型转换为Unicode和从Unicode转换时,字节字符串的数量

      data = unicode(random_byte_string)
    
  • 当字节和Unicode字符串写入/从文件或终端写入时

      print(open("The full text of War and Peace.txt").read())
    

这里涉及到Python功能的多个部分:读取源代码并解析字符串文本转码,以及打印。每个国家都有自己的惯例

简短答复:

  • 出于代码解析的目的:
    • str
      (Py2)--不适用,从文件中获取原始字节
    • unicode
      (Py2)/
      str
      (Py3)-“源代码编码”,默认为
      ascii
      (Py2)和
      utf-8
      (Py3)
    • 字节
      (Py3)--文本中禁止使用无、非ASCII字符
  • 为了转码的目的:
    • 两者(Py2)--
      sys.getdefaultencoding()
      ascii
      几乎总是)
      • 存在隐式转换,通常会导致出现
        UnicodeDecodeError
        /
        UnicodeDecodeError
    • 两者(Py3)--无,在转换时必须显式指定编码
  • 对于I/O而言:
    • unicode
      (Py2)--
      .encoding
      如果设置,否则
      sys.getdefaultencoding()
    • str
      (Py2)--不适用,写入原始字节
    • str
      (Py3)--
      .encoding
      ,始终设置并默认为
      locale.getpreferredencoding()
    • bytes
      (Py3)——无,
      print
      ing生成其
      repr()

首先,对一些术语进行澄清,以便您正确理解其余术语解码是从字节到字符的转换(Unicode或其他),而编码(作为一个过程)则是相反的。看看有没有区别

现在

读取源和解析字符串文本 (其确切效果将在后面描述)。如果未指定,Python 2的默认值为
ascii
,Python 3的默认值为
utf-8
。UTF-8 BOM与
UTF-8
编码声明具有相同的效果

Python 2 Python2将源代码读取为原始字节。它只在看到Unicode文本时使用“源编码”来解析Unicode文本。(,但这是净效应。)

>键入t.py
#编码:cp1251
s=“аббббббббб”
us=u“бббГб”
打印报告,报告(美国)
>py-2t.py
'\xe0\xe1\xe2\xe3\xe4'u'\u0430\u0431\u0432\u0433\u0434'
>py-2t.py
'\xe0\xe1\xe2\xe3\xe4'u'\u0440\u0441\u0442\u0443\u0444'
>py-2t.py
'\xd0\xb0\xd0\xb1\xd0\xb2\xd0\xb3\xd0\xb4'u'\u0430\u0431\u0432\u0433\u0434'
因此,常规字符串将包含文件中的确切字节。Unicode字符串将包含使用“源编码”对文件字节进行解码的结果。

如果解码失败,您将得到一个
SyntaxError
。如果在未指定编码的情况下,文件中存在非ASCII字符,则相同。最后,如果使用了,任何常规字符串文本()在解析时都被视为Unicode文本,这意味着什么

Python 3 Python3使用“源代码编码”将整个源文件解码为Unicode字符序列。任何解析都是在这之后完成的。(特别是,这使得标识符中有Unicode成为可能。)由于所有字符串文字现在都是Unicode,因此不需要额外的转码。在字节文字中,禁止使用非ASCII字符(此类字节必须使用转义序列指定),从而完全避免了问题

转码 根据开始时的澄清:

  • str
    (Py2)/
    bytes
    (Py3)——bytes=>只能是
    解码
    d(即直接解码;详细信息如下)
  • unicode
    (Py2)/
    str
    (Py3)--字符=>只能是
    encode
    d
Python 2 在这两种情况下,如果未指定编码,则使用
sys.getdefaultencoding()
。它是
ascii
(除非您在
site.py
中取消注释一个代码块,这会导致错误)。因此,为了进行代码转换,
sys.getdefaultencoding()
是“字符串的默认编码”。

现在,这里有一个警告:

  • a
    decode()
    encode()
    ——使用默认编码——在转换
    strunicode
    时隐式完成:

    • 在字符串格式中(三分之一的
      unicodecodeerror
      /
      unicodecodeerror
      有关堆栈溢出的问题与此有关)
    • 尝试
      encode()
      a
      str
      decode()
      a
      unicode
      (堆栈溢出问题的第二个三分之一)
Python 3 根本没有“默认编码”:现在禁止在
str
字节之间进行隐式转换

  • bytes
    只能是
    decode
    d和
    str
    --
    encode
    d,并且
    encoding
    参数是必需的
  • 转换
    bytes->str
    (包括隐式)会生成其
    repr()
    (仅对调试打印有用),从而完全避免了编码问题
  • 禁止转换
    str->bytes
印刷 与变量的值无关,但与
print
ed时您在屏幕上看到的内容相关——以及
print
ing时您是否会得到
UnicodeIncodeError

Python 2
  • 一个
    unicode
    encode> type t.py
    # Encoding: cp1251
    s = "абвгд"
    us = u"абвгд"
    print repr(s), repr(us)
    > py -2 t.py
    '\xe0\xe1\xe2\xe3\xe4' u'\u0430\u0431\u0432\u0433\u0434'
    
    <change encoding declaration in the file to cp866, do not change the contents>
    > py -2 t.py
    '\xe0\xe1\xe2\xe3\xe4' u'\u0440\u0441\u0442\u0443\u0444'
    
    <transcode the file to utf-8, update declaration or replace with BOM>
    > py -2 t.py
    '\xd0\xb0\xd0\xb1\xd0\xb2\xd0\xb3\xd0\xb4' u'\u0430\u0431\u0432\u0433\u0434'