<p>您正在将编码与字节字符串混合在一起。下面是一个简单的工作示例,再现了这个问题。我假设您在一个默认为<code>cp852</code>编码的Windows控制台中运行:</p>
<pre><code>#!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')
</code></pre>
<p>输出(不更换):</p>
^{pr2}$
<p>原因是,<code>name</code>字符串编码在<code>cp852</code>中,而字节字符串常量<code>'ł'</code>是用{<cd5>}的源代码编码的。在</p>
<pre><code>print repr(name)
print repr('ł')
</code></pre>
<p>输出:</p>
<pre><code>'Naturalne myd\x88o od\x98wie\xbeaj\xa5ce'
'\xc5\x82'
</code></pre>
<p>最好的解决方案是使用Unicode字符串:</p>
<pre><code>#!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'ł')
</code></pre>
<p>输出(更换):</p>
<pre><code>Naturalne mydło odświeżające
Naturalne mydlo odświeżające
u'Naturalne myd\u0142o od\u015bwie\u017caj\u0105ce'
u'\u0142'
</code></pre>
<p>注意python3的<code>et.tostring</code>有一个Unicode选项,字符串常量默认为Unicode。字符串的<code>repr()</code>版本也更可读,但是<code>ascii()</code>实现了旧的行为。您还将发现python3.6甚至可以在不使用波兰语代码页的控制台上打印波兰语,所以您可能根本不需要替换这些字符。在</p>
<pre><code>#!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('ł'))
</code></pre>
<p>输出:</p>
<pre><code>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'
</code></pre>