отображение специальных символов в кодировке python utf-8 - PullRequest
0 голосов
/ 16 мая 2018

У меня есть несколько файлов XML с кодировкой utf-8. Эти файлы на разных языках. Мне нужно проанализировать эти файлы (я использую метод elementTree), затем получить конкретный текст из каждого файла, а затем разделить этот текст. Проблема возникает, когда я пытаюсь выполнить синтаксический анализ в языках, в которых есть специальные символы (что довольно хорошо подходит для всех языков, кроме английского) Мне нужен точный текст, показанный в файлах xml, а не кодирующая версия python, чтобы разделение работало и получало полученные данные из длинных текстов, которые я анализирую. Я прочитал, как работает кодировка utf-8 в python, и, в частности, я повторяю это из официальной документации по 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â € 1011 *

Есть ли способ получить специальные символы, которые должны выводиться из анализа?

1 Ответ

0 голосов
/ 18 мая 2018

ElementTree обрабатывает Unicode и вы тоже должны.et.tostring возвращает байтовую строку.Распечатка этого на терминал, который не поддерживает UTF-8, даст вам эту строку мусора.Просто строка Unicode через print child.text.Вам все еще нужно иметь терминал, который поддерживает символы 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.Решение этой проблемы, если вы столкнетесь с ней, - это использовать Python IDE, которая поддерживает UTF-8, или записывать в файлы и просматривать их в редакторе, который поддерживает UTF-8.

Конечно, текущие версии Python(в частности, 3.6+) поддержка Unicode намного лучше.Они игнорируют кодировку терминала Windows и вызывают API-интерфейсы Win32, поддерживающие Unicode напрямую.Они даже будут обрабатывать китайский язык в терминале, хотя для корректной работы требуется поддержка шрифтов.

...