当前位置: 首页 > 面试题库 >

了解解码()和编码()Unicode [重复]

谢建业
2023-03-14
问题内容

这个问题已经在这里有了答案

Unicode错误序数不在范围内 (1个答案)

3年前关闭。

我只是无法了解其功能decode()以及如何encode()在python2.7上工作

我尝试了以下声明

>>> s = u'abcd'
>>> s.encode('utf8')
'abcd'
>>> s.encode('utf16')
'\xff\xfea\x00b\x00c\x00d\x00'
>>> s.encode('utf32')
'\xff\xfe\x00\x00a\x00\x00\x00b\x00\x00\x00c\x00\x00\x00d\x00\x00\x00'

直到这里,我认为这很清楚;encode()将Unicode代码转换为相应的utf-8 / 16/32字节字符串。

但是当我编写代码时:

>>> s.decode('utf8')
u'abcd'
>>> s.decode('utf16')
u'\u6261\u6463'
>>> s.decode('utf32')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/encodings/utf_32.py", line 11, in decode
    return codecs.utf_32_decode(input, errors, True)
UnicodeDecodeError: 'utf32' codec can't decode bytes in position 0-3: codepoint not in range(0x110000)

为什么在decode()unicode类型上的含义?为什么第一个(使用utf8)而不是后者可以工作?是因为python在内部使用utf-8存储unicode字符串吗?

最后一件事:

>>> s2 = '≈'
>>> s2
'\xe2\x89\x88'

引擎盖下会发生什么?“≈”不是ascii字符,那么python会使用编码sys.getfilesystemencoding()返回值隐式转换它吗?


问题答案:

你调用decode一个unicode字符串。Python的有益第一 编码 使用默认的ASCII编码解码器,让你有实际字节的字符串
解码。您无法解码Unicode数据本身,因为它 已经被 解码。

由于字节不是有效的UTF-32数据,因此解码失败。字节串'abcd'可解码为UTF-8,因为ASCII是UTF-8的子集。编码为ASCII然后解码为UTF-8会产生相同的信息。由于UTF-16解码偶然发生了;您提供了4个字节,其十六进制值分别为0x61、0x62、0x63和0x64(字符的ASCII值abcd),并且这些字节可以被解码为UTF-16
little endian\u6261\u6463。但是在UTF-32编码系统中,这4个字节没有有效的解码。

如果s其中包含无法先编码为ASCII的数据,则会出现UnicodeEncodeError异常;注意该名称中的 编码

>>> u'åßç'.decode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mj/Development/venvs/stackoverflow-2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

因为对字节字符串的隐式编码失败。

在Python
3中,unicode对象已重命名为str,并且该str.decode()方法已从类型中删除,以防止此类混淆。只有str.encode()遗体。Pythonstr类型已被bytes仅具有bytes.decode()方法的类型所代替。

第二个示例显示您正在终端或控制台中交互使用Python解释器。Python从终端接收的输入为UTF-8字节,并将这些字节存储在字节串中。如果您使用unicode文字,Python会使用为终端声明的编码自动解码这些字节。您可以内省sys.stdin.encoding一下Python检测到的内容:

>>> import sys
>>> sys.stdin.encoding
'UTF-8'
>>> s = '≈'
>>> s
'\xe2\x89\x88'
>>> s = u'≈'
>>> s
u'\u2248'
>>> print s
≈

反之亦然,当打印sys.stdout.encoding编解码器时,它用于将Unicode字符串自动编码为终端所使用的编解码器,然后,编解码器再次解释这些字节,以在屏幕上显示正确的字形。

如果您不是在Python交互式解释器中工作,而是在使用Python源文件,则使用的编解码器将由PEP-263
Python源代码编码声明确定 ,因为Python
2否则默认将字节解码为ASCII。

sys.getfilesystemencoding()与这一切无关;它告诉您Python认为您的 文件系统元数据
被编码的方式;例如目录中的文件名。当您将unicode路径用于与文件系统相关的调用(例如)时,将使用这些值os.listdir()



 类似资料:
  • 问题内容: 我有一些json,我需要解码,更改然后编码,而不会弄乱任何字符。 如果我在json字符串中包含unicode字符,它将无法解码。我不知道为什么,因为json.org说一个字符串可以包含:。但这在python中也不起作用。 我可以使用utf8_encode,该字符串将允许使用json_decode对字符串进行解码,但是字符会被压缩成其他形式。这是来自结果数组的print_r的结果。两个字

  • html POST方法对我的字符串进行了如下解码: 很抱歉有可能重复。 编辑:“可能重复”中的解决方案不能解决上述问题

  • 我有一个用mvn Exec:java运行的程序(我的主文件是用utf-8编码的,系统的默认字符集是windows-1252) 我不明白为什么第一次打印工作,根据文档getBytes使用给定的字符集将字符串编码成字节序列,字符串构造函数通过使用平台的默认字符集解码指定的字节数组来构造新的字符串

  • 编码是将字符,数字和其他特殊字符等字符序列放入专用格式以进行有效传输的过程。 解码是将编码格式转换回原始字符序列的过程。它与我们通常误解的加密完全不同。编码和解码用于数据通信和存储。编码不应用于传输敏感信息。 URL编码 URL只能使用ASCII字符集通过Internet发送,并且在URL包含除ASCII字符之外的特殊字符的情况下,需要对其进行编码。网址不包含空格,并替换为加号(+)或。 ASCI

  • 主要内容:URL基本组成,哪些字符需要编码,Python实现编码与解码,Python 的标准库urllib.parse模块中提供了用来编码和解码的方法,分别是 urlencode() 与 unquote() 方法。当 URL 路径或者查询参数中,带有中文或者特殊字符的时候,就需要对 URL 进行编码(采用十六进制编码格式)。URL 编码的原则是使用安全字符去表示那些不安全的字符。 安全字符,指的是没有特殊用途或者特殊意义的字符。 URL基本组成 URL 是由一些简单的组件构成,比如协议、域名、端

  • 问题内容: 编码URL字符串以使其符合rfc2396并解码与rfc2396兼容的字符串(例如,将%20替换为空格字符)的最佳方法是什么? 编辑:URLEncoder的和URLDecoder类做 不 编码/解码RFC2396兼容网址,它们编码到一个MIME类型application / x-WWW窗体-urlencoded的其用于编码HTML表单参数数据。 问题答案: 使用URI类,如下所示: 或者