Python问题编码和解码在UTF-8中



因此,我正在使用Python 3,正在读取文件并将其分配给一个变量,如字节。然后,我将二进制数据转换为:

的字符串
def to_str(bytes_or_str):
  if isinstance(bytes_or_str, bytes):
    value = bytes_or_str.decode('utf-8', 'replace')
  else:
    value = bytes_or_str
  return value

我这样做的原因是因为我想用包含第一个256 chr()

的列表编辑和替换文件中的某些字符

编辑了加载的文件变量后,我将文件重写为字节:

def to_bytes(bytes_or_str):
  if isinstance(bytes_or_str, str):
    value = bytes_or_str.encode('utf-8', 'replace')
  else:
    value = bytes_or_str
  return value

只要我只使用ASCII字符,它就可以很好。我可以使用Latin-1而不是UTF-8,最多可工作256个字符,但是之后256编码和解码方法被打破。Latin-1是单个字节最多256个字节,这是我猜这是它所工作但不超过256的原因。我想使用UTF-8,因为它涵盖了更广泛的字符,但是上面的两个编码/解码方法失败了,如果我使用不是ASCII的字符,则丢失了数据。我想知道这个问题是否是由于UTF-8在CHR上使用了多个字节(128)还是其他问题引起的?我想知道我是否需要使用pack()方法之类的东西使用多个字节来隔离字符?使用此功能,我可以找到UTF-8中的字符有多少个字节是:

def utf8len(x):
return len(x.encode('utf-8'))

如果编码中数据错误的丢失是由每个字符多个字节引起的,那么也许我可以以某种方式使用它?有人还有其他想法吗?感谢您的任何帮助。

另外:可以说我将此字符"ω"更改为python控制台中的字节:B' xe2 x84 xa6'。如果字节中的每个字符都是更多字符,则该如何工作?当我将字符转换为字节时,Python将其显示为字符,而不是0和1?字节0和1不是吗?我不知道Python在这里做什么。

我制作了此代码来解释其工作原理,但我仍然不完全理解:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def string2bits(s=''):
    return [bin(ord(x))[2:].zfill(8) for x in s]
def bits2string(b=None):
    return ''.join([chr(int(x, 2)) for x in b])
def utf8len(x):
    return len(x.encode('utf-8'))
def latin1len(x):
    return len(x.encode('latin-1'))
char_num = 255
def_char = chr(char_num)
char = def_char
bit = string2bits(char)
char2 = bits2string(bit)
print ('nString:')
print (char2)
print( 'nUTF-8 byte Len:')
print(utf8len(char))
# I had to add this next if statement because:
#  LATIN-1 can't encode character 'u0100' in position 0: ordinal not in range(256)
if char_num < 256:
    print( 'nLatin-1 byte Len:')
    print(latin1len(char))
print ('nList of Bits:')
for x in bit:
    print (x)

在上面的#注释开始时,我可以更改UTF-8和Latin-1之间的编码,还可以更改char_num变量,以查看每个编码中该字符的字符串,但是,如果latin-1的高于255,我会得到错误:unicodeencodeerror:'latin-1'编解码器无法编码字符' u0100' u0100':ordinal不在范围内(256)

如果我用:

将编码从UTF-8到Latin-1的编码
#!/usr/bin/env python
# -*- coding: latin-1 -*-

此代码不应该显示def_char的位用于拉丁-1编码吗?Python如何在这里工作?

我认为问题是,在JPEG标题中,有存储的值可以具有字节的任何值(例如像素密度,标记的长度等)。

https://en.wikipedia.org/wiki/jpeg_file_interchange_format

在拉丁-1中,每个字符都是一个字节,但并非定义0-255之间的每个值。

https://en.wikipedia.org/wiki/iso/iec_8859-1

但是,UTF-8是多重编码。如果您超过127,则第一个字节必须从110(适用于2个字节字符),1110(三个字节字符)和11110(对于四个字节字符)开始。第二,第三和第四字节必须从10开始...

https://en.wikipedia.org/wiki/utf-8

,如果您读取任意字节,并且您可能通过阅读JPEG标题,那么获得无效字节(序列)的可能性很高。因此,可以是,您对Latin-1的字节有效,而不是偶然地。

最新更新