使用python utf-8编码显示特殊字符

时间:2018-05-16 14:04:45

标签: python-2.7 utf-8

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

$typeString = null;
$typeInt = exif_imagetype($newFilename);
switch($typeInt) {
  case IMG_GIF:
    $typeString = 'image/gif';
    break;
  case IMG_JPG:
    $typeString = 'image/jpg';
    break;
  case IMG_JPEG:
    $typeString = 'image/jpeg';
    break;
  case IMG_PNG:
    $typeString = 'image/png';
    break;
  case IMG_WBMP:
    $typeString = 'image/wbmp';
    break;
  case IMG_XPM:
    $typeString = 'image/xpm';
    break;
  default:
    $typeString = 'unknown';
}

我还从python 3及更高版本中读到可以显示特殊字符,但我使用的是python 2.7,而我运行程序的软件工具不能支持python 3.

代码如下:

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.
目前印刷只是为了我的方便,我想做的工作不需要。 为了给你一个更具体的例子,xml文件中的文本的一部分是这样的: EttingerStraße

将schild转换为字符串后我得到的是: EttingerStraße“

有没有办法让特殊字符从解析中删除?

1 个答案:

答案 0 :(得分:0)

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。他们甚至会在终端上处理中文,但需要字体支持才能正常查看。