【发布时间】:2021-08-29 01:48:27
【问题描述】:
根据 Wikipedia,ASCII 是 7 位编码。由于每个地址(当时和现在)存储 8 位,因此无关的第 8 位可以用作奇偶校验位。
委员会投票决定使用七位代码以最大限度地降低成本 与数据传输有关。由于当时的穿孔胶带 可以在一个位置记录八位,它还允许奇偶校验 如果需要,用于错误检查。[3]:217, 236 §5 八位机器 (使用八位字节作为本机数据类型)不使用奇偶校验 通常将第八位设置为 0。
似乎没有规定存储 ASCII 字符的字节中的第 8 位必须为 0。因此,在解码 ASCII 字符时,我们是否必须考虑第 8 位可能设置为 1 的可能性? Python 似乎没有考虑到这一点——应该吗?还是我们保证奇偶校验位始终为 0(按照某些官方标准)?
示例
如果奇偶校验位为 0(默认),那么 Python 可以解码一个字符('@'):
int('0b01000000', 2).to_bytes(1, byteorder='little').decode("ascii")
# Outputs: '@'
但如果奇偶校验位设置为 1,则byte.decode 失败:
int('0b11000000', 2).to_bytes(1, byteorder='little').decode("ascii")
""" Outputs:
Traceback (most recent call last):
File "<pyshell#61>", line 1, in <module>
int('0b11000000', 2).to_bytes(1, byteorder='little').decode("ascii")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc0 in position 0: ordinal not in range(128)
"""
但第 8 位的值无关紧要,因为 ASCII 仅使用 7 位。注意:我不是在问如何让byte.decode 使用非零奇偶校验位,而是在询问解码器是否应该明确忽略它。
【问题讨论】:
标签: python character-encoding character ascii