特别篇之(标准编码)

标准编码

Python 自带了许多内置的编解码器,它们的实现或者是通过 C 函数,或者是通过映射表。 以下表格是按名称排序的编解码器列表,并提供了一些常见别名以及编码格式通常针对的语言。 别名和语言列表都不是详尽无遗的。 请注意仅有大小写区别或使用连字符替代下划线的拼写形式也都是有效的别名;因此,'utf-8''utf_8' 编解码器的有效别名。

CPython implementation detail: 有些常见编码格式可以绕过编解码器查找机制来提升性能。 这些优化机会对于 CPython 来说仅能通过一组有限的别名(大小写不敏感)来识别:utf-8, utf8, latin-1, latin1, iso-8859-1, iso8859-1, mbcs (Windows 专属), ascii, us-ascii, utf-16, utf16, utf-32, utf32, 也包括使用下划线替代连字符的的形式。 使用这些编码格式的其他别名可能会导致更慢的执行速度。

在 3.6 版更改: 可识别针对 us-ascii 的优化机会。

许多字符集都支持相同的语言。 它们在个别字符(例如是否支持 EURO SIGN 等)以及给字符所分配的码位方面存在差异。 特别是对于欧洲语言来说,通常存在以下几种变体:

  • 某个 ISO 8859 编码集
  • 某个 Microsoft Windows 编码页,通常是派生自某个 8859 编码集,但会用附加的图形字符来替换控制字符。
  • 某个 IBM EBCDIC 编码页
  • 某个 IBM PC 编码页,通常会兼容 ASCII
编码别名语言
ascii646, us-ascii英语
big5big5-tw, csbig5繁体中文
big5hkscsbig5-hkscs, hkscs繁体中文
cp037IBM037, IBM039英语
cp273273, IBM273, csIBM273德语3.4 新版功能.
cp424EBCDIC-CP-HE, IBM424希伯来语
cp437437, IBM437英语
cp500EBCDIC-CP-BE, EBCDIC-CP-CH, IBM500西欧
cp720阿拉伯语
cp737希腊语
cp775IBM775波罗的海语言
cp850850, IBM850西欧
cp852852, IBM852中欧和东欧
cp855855, IBM855保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语
cp856希伯来语
cp857857, IBM857土耳其语
cp858858, IBM858西欧
cp860860, IBM860葡萄牙语
cp861861, CP-IS, IBM861冰岛语
cp862862, IBM862希伯来语
cp863863, IBM863加拿大语
cp864IBM864阿拉伯语
cp865865, IBM865丹麦语/挪威语
cp866866, IBM866俄语
cp869869, CP-GR, IBM869希腊语
cp874泰语
cp875希腊语
cp932932, ms932, mskanji, ms-kanji日语
cp949949, ms949, uhc韩语
cp950950, ms950繁体中文
cp1006乌尔都语
cp1026ibm1026土耳其语
cp11251125, ibm1125, cp866u, ruscii乌克兰语3.4 新版功能.
cp1140ibm1140西欧
cp1250windows-1250中欧和东欧
cp1251windows-1251保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语
cp1252windows-1252西欧
cp1253windows-1253希腊语
cp1254windows-1254土耳其语
cp1255windows-1255希伯来语
cp1256windows-1256阿拉伯语
cp1257windows-1257波罗的海语言
cp1258windows-1258越南语
euc_jpeucjp, ujis, u-jis日语
euc_jis_2004jisx0213, eucjis2004日语
euc_jisx0213eucjisx0213日语
euc_kreuckr, korean, ksc5601, ks_c-5601, ks_c-5601-1987, ksx1001, ks_x-1001韩语
gb2312chinese, csiso58gb231280, euc-cn, euccn, eucgb2312-cn, gb2312-1980, gb2312-80, iso-ir-58简体中文
gbk936, cp936, ms936统一汉语
gb18030gb18030-2000统一汉语
hzhzgb, hz-gb, hz-gb-2312简体中文
iso2022_jpcsiso2022jp, iso2022jp, iso-2022-jp日语
iso2022_jp_1iso2022jp-1, iso-2022-jp-1日语
iso2022_jp_2iso2022jp-2, iso-2022-jp-2日语,韩语,简体中文,西欧,希腊语
iso2022_jp_2004iso2022jp-2004, iso-2022-jp-2004日语
iso2022_jp_3iso2022jp-3, iso-2022-jp-3日语
iso2022_jp_extiso2022jp-ext, iso-2022-jp-ext日语
iso2022_krcsiso2022kr, iso2022kr, iso-2022-kr韩语
latin_1iso-8859-1, iso8859-1, 8859, cp819, latin, latin1, L1西欧
iso8859_2iso-8859-2, latin2, L2中欧和东欧
iso8859_3iso-8859-3, latin3, L3世界语,马耳他语
iso8859_4iso-8859-4, latin4, L4波罗的海语言
iso8859_5iso-8859-5, cyrillic保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语
iso8859_6iso-8859-6, arabic阿拉伯语
iso8859_7iso-8859-7, greek, greek8希腊语
iso8859_8iso-8859-8, hebrew希伯来语
iso8859_9iso-8859-9, latin5, L5土耳其语
iso8859_10iso-8859-10, latin6, L6北欧语言
iso8859_11iso-8859-11, thai泰语
iso8859_13iso-8859-13, latin7, L7波罗的海语言
iso8859_14iso-8859-14, latin8, L8凯尔特语
iso8859_15iso-8859-15, latin9, L9西欧
iso8859_16iso-8859-16, latin10, L10东南欧
johabcp1361, ms1361韩语
koi8_r俄语
koi8_t塔吉克3.5 新版功能.
koi8_u乌克兰语
kz1048kz_1048, strk1048_2002, rk1048哈萨克语3.5 新版功能.
mac_cyrillicmaccyrillic保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语
mac_greekmacgreek希腊语
mac_icelandmaciceland冰岛语
mac_latin2maclatin2, maccentraleurope中欧和东欧
mac_romanmacroman, macintosh西欧
mac_turkishmacturkish土耳其语
ptcp154csptcp154, pt154, cp154, cyrillic-asian哈萨克语
shift_jiscsshiftjis, shiftjis, sjis, s_jis日语
shift_jis_2004shiftjis2004, sjis_2004, sjis2004日语
shift_jisx0213shiftjisx0213, sjisx0213, s_jisx0213日语
utf_32U32, utf32所有语言
utf_32_beUTF-32BE所有语言
utf_32_leUTF-32LE所有语言
utf_16U16, utf16所有语言
utf_16_beUTF-16BE所有语言
utf_16_leUTF-16LE所有语言
utf_7U7, unicode-1-1-utf-7所有语言
utf_8U8, UTF, utf8, cp65001所有语言
utf_8_sig所有语言

在 3.4 版更改: utf-16* 和 utf-32* 编码器将不再允许编码代理码位 (U+D800U+DFFF)。 utf-32* 解码器将不再解码与代理码位相对应的字节序列。

在 3.8 版更改: cp65001 现在是 utf_8 的一个别名。

Python 专属的编码格式

有一些预定义编解码器是 Python 专属的,因此它们在 Python 之外没有意义。 这些编解码器按其所预期的输入和输出类型在下表中列出(请注意虽然文本编码是编解码器最常见的使用场景,但下层的编解码器架构支持任意数据转换而不仅是文本编码)。 对于非对称编解码器,该列描述的含义是编码方向。

文字编码

以下编解码器提供了 strbytes 的编码和 bytes-like objectstr 的解码,类似于 Unicode 文本编码。

编码别名含义
idna实现 RFC 3490,另请参阅 encodings.idna 。仅支持 errors='strict'
mbcsansi, dbcsWindows 专属:根据 ANSI 代码页(CP_ACP)对操作数进行编码。
oemWindows 专属:根据 OEM 代码页(CP_OEMCP)对操作数进行编码。3.6 新版功能.
palmosPalmOS 3.5 的编码格式
punycode实现 RFC 3492。 不支持有状态编解码器。
raw_unicode_escapeLatin-1 编码格式附带对其他码位以 \uXXXX\UXXXXXXXX 进行编码。 现有反斜杠不会以任何方式转义。 它被用于 Python 的 pickle 协议。
undefined所有转换都将引发异常,甚至对空字符串也不例外。 错误处理方案会被忽略。
unicode_escape适合用于以 ASCII 编码的 Python 源代码中的 Unicode 字面值内容的编码格式,但引号不会被转义。 对 Latin-1 源代码进行解码。 请注意 Python 源代码实际上默认使用 UTF-8。

在 3.8 版更改: “unicode_internal” 编解码器已被移除。

二进制转换

以下编解码器提供了二进制转换: bytes-like objectbytes 的映射。 它们不被 bytes.decode() 所支持(该方法只生成 str 类型的输出)。

编码别名含义编码器/解码器
base64_codec 1base64, base_64将操作数转换为多行 MIME base64 (结果总是包含一个末尾的 '\n')在 3.4 版更改: 接受任意 bytes-like object 作为输入用于编码和解码base64.encodebytes() / base64.decodebytes()
bz2_codecbz2使用bz2压缩操作数bz2.compress() / bz2.decompress()
hex_codechex将操作数转换为十六进制表示,每个字节有两位数binascii.b2a_hex() / binascii.a2b_hex()
quopri_codecquopri, quotedprintable, quoted_printable将操作数转换为 MIME 带引号的可打印数据quopri.encode()quotetabs=True / quopri.decode()
uu_codecuu使用uuencode转换操作数uu.encode() / uu.decode()
zlib_codeczip, zlib使用gzip压缩操作数zlib.compress() / zlib.decompress()
  • 1

    除了 字节类对象'base64_codec' 也接受仅包含 ASCII 的 str 实例用于解码

3.2 新版功能: 恢复二进制转换。

在 3.4 版更改: 恢复二进制转换的别名。

文字转换

以下编解码器提供了文本转换: strstr 的映射。 它不被 str.encode() 所支持(该方法只生成 bytes 类型的输出)。

编码别名含义
rot_13rot13返回操作数的凯撒密码加密结果

3.2 新版功能: 恢复 rot_13 文本转换。

在 3.4 版更改: 恢复 rot13 别名。

encodings.idna — 应用程序中的国际化域名

此模块实现了 RFC 3490 (应用程序中的国际化域名) 和 RFC 3492 (Nameprep: 用于国际化域名 (IDN) 的 Stringprep 配置文件)。 它是在 punycode 编码格式和 stringprep 的基础上构建的。

这些 RFC 共同定义了一个在域名中支持非 ASCII 字符的协议。 一个包含非 ASCII 字符的域名 (例如 www.Alliancefrançaise.nu) 会被转换为兼容 ASCII 的编码格式 (简称 ACE,例如 www.xn--alliancefranaise-npb.nu)。 随后此域名的 ACE 形式可以用于所有由于特定协议而不允许使用任意字符的场合,例如 DNS 查询,HTTP Host 字段等等。 此转换是在应用中进行的;如有可能将对用户可见:应用应当透明地将 Unicode 域名标签转换为线上的 IDNA,并在 ACE 标签被呈现给用户之前将其转换回 Unicode。

Python 以多种方式支持这种转换: idna 编解码器执行 Unicode 和 ACE 之间的转换,基于在 section 3.1 of RFC 3490 中定义的分隔字符将输入字符串拆分为标签,再根据需要将每个标签转换为 ACE,相反地又会基于 . 分隔符将输入字节串拆分为标签,再将找到的任何 ACE 标签转换为 Unicode。 此外,socket 模块可透明地将 Unicode 主机名转换为 ACE,以便应用在将它们传给 socket 模块时无须自行转换主机名。 除此之外,许多包含以主机名作为函数参数的模块例如 http.clientftplib 都接受 Unicode 主机名(并且 http.client 也会在 Host 字段中透明地发送 IDNA 主机名,如果它需要发送该字段的话)。

当从线路接收主机名时(例如反向名称查找),到 Unicode 的转换不会自动被执行:希望向用户提供此种主机名的应用应当将它们解码为 Unicode。

encodings.idna 模块还实现了 nameprep 过程,该过程会对主机名执行特定的规范化操作,以实现国际域名的大小写不敏感特性与合并相似的字符。 如果有需要可以直接使用 nameprep 函数。

  • encodings.idna.``nameprep(label)

    返回 label 经过名称处理操作的版本。 该实现目前基于查询字符串,因此 AllowUnassigned 为真值。

  • encodings.idna.``ToASCII(label)

    将标签转换为 ASCII,规则定义见 RFC 3490UseSTD3ASCIIRules 预设为假值。

  • encodings.idna.``ToUnicode(label)

    将标签转换为 Unicode,规则定义见 RFC 3490

encodings.mbcs — Windows ANSI代码页

此模块实现ANSI代码页(CP_ACP)。

Availability: 仅Windows可用

在 3.3 版更改: 支持任何错误处理

在 3.2 版更改: 在 3.2 版之前, errors 参数会被忽略;总是会使用 'replace' 进行编码,并使用 'ignore' 进行解码。

encodings.utf_8_sig — 带BOM签名的UTF-8编解码器

此模块实现了 UTF-8 编解码器的一个变种:在编码时将把 UTF-8 已编码 BOM 添加到 UTF-8 编码字节数据的开头。 对于有状态编码器此操作只执行一次(当首次写入字节流时)。 在解码时将跳过数据开头作为可选项的 UTF-8 已编码 BOM。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Misra C编码标准是一种广泛使用的软件编码规范,它针对C语言编程而设计。Misra C规范旨在提高软件质量、减少错误和缺陷,并提高代码的可读性、可维护性和可重用性。 Misra C规范包括一系列规则和指南,这些规则主要是关于编码风格、代码结构、变量命名、注释和错误处理等方面的。这些规则帮助开发人员创建更加一致、清晰和易于维护的代码。 Misra C规范被广泛应用于许多行业,特别是在汽车和航空航天等领域,这些行业对软件的可靠性和安全性要求非常高。Misra C规范可用于确保软件符合行业规范和标准,并减少软件开发过程中可能出现的潜在问题和风险。 总的来说,Misra C规范是一种有用的工具,可帮助开发人员提高他们的编码技能和创造高质量、可靠和安全的软件。 ### 回答2: MISRA C是针对嵌入式C语言开发的编码标准,目的是提高代码的可读性、可维护性和可重用性,提高代码的安全性和可靠性。MISRA C标准要求程序员遵循一些规范和原则,如:禁止使用一些不安全的语言特性、规定变量名的命名规则、指定函数的输入和输出参数、统一代码缩进、禁止使用无符号类型等。此外,MISRA C标准还要求检查代码的静态分析工具,以确保代码符合标准的规定。MISRA C标准的最新版本是MISRA C2012,它强调了更多的可读性和可维护性,包括更严格的类型匹配规则,更明确的行为定义和更严格的格式要求。MISRA C标准虽然对于开发人员提出了更多的要求,但也可以提高代码的质量和可靠性,尤其适用于需要高度安全和可靠性的嵌入式系统开发过程中。 ### 回答3: Misra C 编码标准是一种广泛使用的编码规范,旨在提高嵌入式系统代码质量、可维护性和可移植性。该规范是由英国工程师 Michael Barr 和 Dhananjay Gadre 等人创建,其名称得名自其发起公司 Motor Industry Software Reliability Association。Misra C 编码标准的主要目标是避免 C 语言中的错误和问题,并以此提高代码的质量和可靠性。 Misra C 编码标准包括 14 个章节和 146 个规则,覆盖了诸如数据类型、循环、结构、布尔表达式、指针等方面的问题。其中,一些重要的规则包括:使用 ANSI C 标准;避免使用无符号类型;函数的声明和定义应该一致;避免使用递归;指针的使用应该谨慎且熟悉;代码中应该避免使用全局变量等。Misra C 编码标准还包括了几个附录,其中包括16位和32位系统的限制条件和一些相关的工具和风格指南。 通过遵循 Misra C 编码标准,可以帮助开发人员创建更安全、高质量、易于维护和可移植的代码,并减少代码中的漏洞和错误。Misra C 编码标准也有助于提高代码重用性,减少代码膨胀,降低软件开发成本,并提高软件开发效率。此外,Misra C 编码标准还被广泛应用于汽车、航空和医疗等领域,并成为嵌入式系统开发中最受欢迎的编码标准之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值