簡體   English   中英

比較Python中的特殊字符

[英]Comparing special characters in Python

我有一個字符串,其值為'Opérations'。 在我的腳本中,我將讀取一個文件並進行一些比較。 比較字符串時,我從同一來源復制並放置在python腳本中的字符串不等於在腳本中讀取相同文件時收到的字符串。 打印兩個字符串都會給我“操作”。 但是,當我將其編碼為utf-8時,我注意到了區別。

  • b'Ope \\ XCC \\ x81rations'
  • b'Op \\ XC3 \\ xa9rations'

我的問題是,在比較此類字符串時,我該怎么做以確保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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM