python之编码5

#为了正确比较而规范化Unicode字符串,因为Unicode有组合字符(变音符号和附加到前一个字符上的记号,打印时作为一个整体),所以字符串比较起来很复杂。“café”这个词可以使用两种方式构成,分别有4个和5个码位,但是结果完全一样:

s1=café

s2=cafe\u

print(s1,s2)#(café,café)

print(len(s1),len(s2))#(4,5)

print(s1==s2)#False

#U+是COMBININGACUTEACCENT,加在“e”后面得到“é”。在Unicode标准中,é和e\u这样的序列叫“标准等价物”(canonicalequivalent),应用程序应该把它们视作相同的字符。但是,Python看到的是不同的码位序列,因此判定二者不相等。使用unicodedata.normalize函数提供的Unicode规范化。这个函数的第一个参数是这4个字符串中的一个:NFC、NFD、NFKC和NFKD。NFC(NormalizationFormC)使用最少的码位构成等价的字符串,而NFD把组合字符分解成基字符和单独的组合字符。

fromunicodedataimportnormalize

s1=café#把"e"和重音符组合在一起

s2=cafe\u#分解成"e"和重音符

print(len(s1),len(s2))#(4,5)

print(len(normalize(NFC,s1)),len(normalize(NFC,s2)))#(4,4)

print(len(normalize(NFD,s1)),len(normalize(NFD,s2)))#(5,5)

print(normalize(NFC,s1)==normalize(NFC,s2))#True

print(normalize(NFD,s1)==normalize(NFD,s2))#True

#西方键盘通常能输出组合字符,因此用户输入的文本默认是NFC形式。不过,安全起见,保存文本之前,最好使用normalize(NFC,user_text)清洗字符串。NFC也是W3C的“CharacterModelfortheWorldWideWeb:StringMatchingandSearching”规范推荐的规范化形式。使用NFC时,有些单字符会被规范成另一个单字符。例如,电阻的单位欧姆(Ω)会被规范成希腊字母大写的欧米加。这两个字符在视觉上是一样的,但是比较时并不相等,因此要规范化,防止出现意外:

fromunicodedataimportnormalize,name

ohm=\u

print(name(ohm))#OHMSIGN

ohm_c=normalize(NFC,ohm)

print(name(ohm_c))#GREEKCAPITALLETTEROMEGA

print(ohm==ohm_c)#False

print(normalize(NFC,ohm)==normalize(NFC,ohm_c))#True

#在另外两个规范化形式(NFKC和NFKD)的首字母缩略词中,字母K表示“



转载请注明地址:http://www.sanbaicaoasb.com/scgx/8558.html
  • 上一篇文章:
  • 下一篇文章:
  • 热点文章

    • 没有热点文章

    推荐文章

    • 没有推荐文章