[英]Comparing special characters in Python
我有一個字符串,其值為'Opérations'。 在我的腳本中,我將讀取一個文件並進行一些比較。 比較字符串時,我從同一來源復制並放置在python腳本中的字符串不等於在腳本中讀取相同文件時收到的字符串。 打印兩個字符串都會給我“操作”。 但是,當我將其編碼為utf-8時,我注意到了區別。
我的問題是,在比較此類字符串時,我該怎么做以確保python腳本中的特殊字符與文件內容相同。
很高興知道:
您正在談論兩種類型的字符串,字節字符串和unicode字符串。 每個都有一個將其轉換為其他類型的字符串的方法。 Unicode字符串具有產生字節的.encode()方法,而字節字符串具有產生unicode的.decode()方法。 它的意思是:
unicode.enocde()---->字節
和
bytes.decode()-----> unicode
UTF-8無疑是最流行的Unicode存儲和傳輸編碼。 它為每個代碼點使用可變數量的字節。 代碼點值越高,在UTF-8中需要的字節就越多。
講到重點:
如果將字符串重新定義為兩個Byte字符串和unicode字符串,如下所示:
a_byte = b'Ope\xcc\x81rations'
a_unicode = u'Ope\xcc\x81rations'
和
b_byte = b'Op\xc3\xa9rations'
b_unicode = u'Op\xc3\xa9rations'
您會看到:
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_byte時,b_byte將Opérations
打印為輸出,但是:
print repr(a_byte),repr(b_byte)
將返回:
'Ope\xcc\x81rations','Op\xc3\xa9rations'
您還可以在比較之前將unicode標准化為@Daniel 的答案 ,如下所示:
from unicodedata import normalize
from functools import partial
a_byte = 'Opérations'
norm = partial(normalize, 'NFC')
your_string = norm(a_byte.decode('utf8'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.