2024-06-17 13:14:44 发布
网友
我有一个值为'Opérations'的字符串。在我的脚本中,我将读取一个文件并进行一些比较。在比较字符串时,我从同一个源复制并放在python脚本中的字符串与在脚本中读取相同文件时收到的字符串不相同。打印这两个字符串给我“操作”。然而,当我将其编码为utf-8时,我注意到了不同之处。在
我的问题是,在比较这些字符串时,如何确保python脚本中的特殊字符与文件内容的特殊字符相同。在
好消息:
你说的是两种类型的字符串,字节字符串和unicode字符串。每一个都有一个方法将其转换为另一种类型的字符串。Unicode字符串有一个生成字节的.encode()方法,字节字符串有一个生成Unicode的.decode()方法。意思是:
unicode.enocde() > bytes
以及
bytes.decode() -> unicode
UTF-8是Unicode存储和传输中最流行的编码方式。它为每个代码点使用可变的字节数。码位值越高,在UTF-8中需要的字节越多。在
切中要害:
如果将字符串重新定义为双字节字符串和unicode字符串,如下所示:
a_byte = b'Ope\xcc\x81rations' a_unicode = u'Ope\xcc\x81rations'
你会看到:
print 'a_byte lenght is: ', len(a_byte.decode("utf-8")) #print 'a_unicode lenght is: ',len(a_unicode.encode("utf-8")) print 'b_byte lenght is: ',len(b_byte.decode("utf-8")) #print 'b_unicode lenght is: ', len(b_unicode.encode("utf-8"))
输出:
a_byte lenght is: 11 b_byte lenght is: 10
所以你看他们是不一样的。在
我的解决方案:
如果不想混淆,那么可以使用repr(),当打印a字节时,b字节打印Opérations作为输出,但是:
Opérations
print repr(a_byte),repr(b_byte)
将返回:
'Ope\xcc\x81rations','Op\xc3\xa9rations'
还可以将比较前的unicode规范化为@Daniel's answer,如下所示:
from unicodedata import normalize from functools import partial a_byte = 'Opérations' norm = partial(normalize, 'NFC') your_string = norm(a_byte.decode('utf8'))
好消息:
你说的是两种类型的字符串,字节字符串和unicode字符串。每一个都有一个方法将其转换为另一种类型的字符串。Unicode字符串有一个生成字节的.encode()方法,字节字符串有一个生成Unicode的.decode()方法。意思是:
以及
UTF-8是Unicode存储和传输中最流行的编码方式。它为每个代码点使用可变的字节数。码位值越高,在UTF-8中需要的字节越多。在
切中要害:
如果将字符串重新定义为双字节字符串和unicode字符串,如下所示:
以及
^{pr2}$你会看到:
输出:
所以你看他们是不一样的。在
我的解决方案:
如果不想混淆,那么可以使用repr(),当打印a字节时,b字节打印
Opérations
作为输出,但是:将返回:
还可以将比较前的unicode规范化为@Daniel's answer,如下所示:
相关问题 更多 >
编程相关推荐