您正在將編碼與您的字節字符串混合。以下是重現問題的簡短工作示例。我假設你在Windows控制檯運行默認的cp852
編碼:
#!python2
# coding: utf-8
from xml.etree import ElementTree as et
name_element = et.Element('data')
name_element.text = u'Naturalne mydło odświeżające'
name = et.tostring(name_element,encoding='cp852', method='text')
print name
print name.replace('ł', 'l')
輸出(沒有替換):
原因是,該name
串在cp852
但編碼字節字符串常量'ł'
以utf-8
的源代碼編碼進行編碼。
print repr(name)
print repr('ł')
輸出:
'Naturalne myd\x88o od\x98wie\xbeaj\xa5ce'
'\xc5\x82'
最好的解決方案是使用Unicode字符串:
#!python2
# coding: utf-8
from xml.etree import ElementTree as et
name_element = et.Element('data')
name_element.text = u'Naturalne mydło odświeżające'
name = et.tostring(name_element,encoding='cp852', method='text').decode('cp852')
print name
print name.replace(u'ł', u'l')
print repr(name)
print repr(u'ł')
輸出(作了替代):
Naturalne mydło odświeżające
Naturalne mydlo odświeżające
u'Naturalne myd\u0142o od\u015bwie\u017caj\u0105ce'
u'\u0142'
注意,Python 3中的et.tostring
有一個Unicode選項,字符串常量默認是Unicode。 repr()
版本的字符串也更具可讀性,但ascii()
實現了舊的行爲。你還會發現Python 3.6將打印波蘭語,甚至不使用波蘭代碼頁的遊戲機,所以也許你根本不需要替換字符。
#!python3
# coding: utf-8
from xml.etree import ElementTree as et
name_element = et.Element('data')
name_element.text = 'Naturalne mydło odświeżające'
name = et.tostring(name_element,encoding='unicode', method='text')
print(name)
print(name.replace('ł','l'))
print(repr(name),repr('ł'))
print(ascii(name),ascii('ł'))
輸出:
Naturalne mydło odświeżające
Naturalne mydlo odświeżające
'Naturalne mydło odświeżające' 'ł'
'Naturalne myd\u0142o od\u015bwie\u017caj\u0105ce' '\u0142'
您需要兩個字符串的Unicode形式歸一化爲相同的[正常形式](https://en.m.wikipedia.org/wiki/Unicode_equivalence)。 –
[可以somone解釋unicodedata.normalize(form,unistr)如何與示例一起使用的可能的副本?](https://stackoverflow.com/questions/14682397/can-somone-explain-how-unicodedata-normalizeform-unistr-work -with-examples) –