使用 Python UTF-8 编码显示特殊字符



我有几个使用 utf-8 编码的 XML 文件。这些文件使用不同的语言。我需要解析这些文件(我使用的是elementTree方法),然后从每个文件中获取特定的文本,然后拆分该文本。当我尝试解析内部有特殊字符的语言时会出现问题(这与除英语以外的每种语言都非常匹配)。我需要 xml 文件中显示的 excact 文本,而不是 python 的编码版本,以便拆分分离工作并从我正在解析的长文本中获取获取的数据。 我已经阅读了在 python 中编码 utf-8 的工作原理,特别是我从官方 python 文档中重新阅读了这一点。

If the code point is < 128, it’s represented by the corresponding byte value.
If the code point is >= 128, it’s turned into a sequence of two, three, or four bytes, where each byte of the sequence is between 128 and 255.

我还从 python 3 及更高版本中读到可以显示特殊字符,但我使用的是 python 2.7,并且我正在运行程序的软件工具无法支持 python 3。

代码如下:

import xml.etree.ElementTree as et
import sys
import io
import string
import codecs
print("using texttool_navi.py" + sXmlFile)
#intializing Variables
sAddress = ''
sAcronym = ''
sPlace = ''
sData = ''
# parse texttool file
Parser =et
tree = et.parse(sXmlFile)
root = tree.getroot()
for child in root:
if child.attrib["ID"] == sID:
schild = et.tostring(child,encoding = 'utf-8')
print('line ' + schild)
sData = child.text
sData = string.split(sData, '"')
print(sData)
sAddress = sData[1]
sAcronym = sData[3]
sPlace = sData[5]
if sID == 'a specific ID':
sAddress = string.replace(sAddress, '\n', ' ')
sAcronym = string.replace(sAcronym, '\n', ' ')
sPlace  = string.replace(sPlace, '\n', ' ')

打印目前只是为了方便我,我想做的工作不需要它。 为了给您一个更具体的示例,XML 文件中文本的一部分是这样的: Ettinger Straße

将孩子转换为字符串后我得到的是这样的: Ettinger straÿe“

有没有办法让特殊字符从解析中消失?

ElementTree 处理 Unicode,你也应该这样做。et.tostring返回一个字节字符串。 将其打印到不支持 UTF-8 的终端会给你那个垃圾字符串。 只是通过print child.text的 Unicode 字符串。 您仍然需要一个支持当前编码的 Unicode 字符的终端。

我在Windows上,控制台默认支持cp437其中包括大多数西欧语言字符。 请注意,直接打印元素文本可以:

>>> import xml.etree.ElementTree as et
>>> test = et.Element('test')
>>> test.text = u'Héllo'
>>> print(et.tostring(test,encoding='utf8'))
<?xml version='1.0' encoding='utf8'?>
<test>Héllo</test>
>>> print test.text
Héllo

Python 会将 Unicode 字符串编码为终端编码(不是 UTF8)。 如果您打印终端不支持的字符(例如中文),您将获得UnicodeEncodeError。 如果您遇到它,解决方案是使用支持 UTF-8 的 Python IDE,或者写入文件并在支持 UTF-8 的编辑器中查看它们。

当然,当前版本的Python(特别是3.6+)更好地支持Unicode。它们忽略Windows终端编码,直接调用支持Unicode的Win32 API。 他们甚至可以将中文处理到终端,尽管这需要字体支持才能正确查看。

最新更新