Преобразование текстовых представлений Hex NCR в Unicode в Python - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть строка, проанализированная с веб-страницы первоначально на китайском языке:

若き葉末には風が立ち 森は翡翠の息を返す 雲の切れ間から注ぐ 光に君を見初めん

碧き瞳のほほえむとき そは鐘のひびき胸に打つ さしのべた腕に絡む 蔦の葉に君を逃す

残る 香り 水面をかけゆく恋の舟 つかの間の波に 揺られ

やさしき幻影 心に映るその姿よ 永遠なる君に 想いを捧げん

若き葉末には風は眠り 森は密やかに息を止む 抱きしめた腕のなかで 静かに君は消えゆく

月は 満ちて 黄金の羽根が舞いおちる 我はただひとり森に

祈りたまえや

Однако в процессе ее анализа она была преобразована в шестнадцатеричную строку NCR в следующем виде:

若き葉末には風が立ち\n森は翡翠の息を返す\n雲の切れ間から注ぐ\n光に君を見初めん\n\n碧き瞳のほほえむとき\nそは鐘のひびき胸に打つ\nさしのべた腕に絡む\n蔦の葉に君を逃す\n\n残る 香り\n水面をかけゆく恋の舟\nつかの間の波に 揺られ\n\nやさしき幻影 心に映るその姿よ\n永遠なる君に 想いを捧げん\n\n若き葉末には風は眠り\n森は密やかに息を止む\n抱きしめた腕のなかで\n静かに君は消えゆく\n\n月は 満ちて\n黄金の羽根が舞いおちる\n我はただひとり森に\n\n祈りたまえや

Я хочу преобразовать эту строку в соответствующий ей формат Unicode.

Из моего исследования я смог собрать, что, например, 一 отображается в строку Unicode b'\\u4e00'.

Это можно сделать вручную, удалив &#x и добавив префикс \\u к началу строки, сделав все это строчными буквами и преобразовав их в строку байтов, добавив b перед строкой.Это делается в этом репо , но с помощью неэффективной функции eval с помощью такого кода, как eval("b'\\u4e00").

[РЕДАКТИРОВАТЬ: вышеуказанный пункт неверен.Это не строка байтов, а строка Юникода, представленная в python2.Правильное отображение будет: 一 -> u'\u4e00']

Есть ли лучший способ сделать это?Рассматривая крайние случаи, когда эти строки шестнадцатеричной карты могут присутствовать в середине обычного текста, такого как здесь:

Je me levais tôt
Travailler en homme
Je me souviens du goût
Du café brûlant
Dans la tasse rouge
Et la femme qui dort
Les portes ouvertes de la grande usine
Bouffaient nos fils le jour de leurs quinze ans
On se levait tôt
Sortis de nos draps
On se retrouvait en bas
Les rues du village s'allumaient d'un coup
A six heures moins le quart
Les portes ouvertes de la grande usine
Bouffaient nos fils bien avant leurs quinze ans
On se lève trop tôt
On sait plus quoi faire
Dans le café des vieux
Les mains dans nos poches
Cachent nos poings noirs
Y'a plus qu'à qui change pas
Les portes sont fermées
Y'a plus de feu qui gronde
L'usine a tout vomi d'un seul coup
Pourquoi on fait ça
Pourquoi ça m'fait ça
Pourquoi on nous fait ça à nous

Я имею дело с большим набором данных, где такие символы могут быть разбросаны в любом месте, и мне нужноосмысленный способ борьбы с ними.

Так есть ли лучший способ сделать это?В идеале тот, который изначально поддерживается Python.

Если у кого-то есть решение моей проблемы здесь, я буду безмерно благодарен.Заранее спасибо.

1 Ответ

0 голосов
/ 15 февраля 2019

Посмотрите на модуль html в стандартной библиотеке:

>>> import html
>>> html.unescape('Je me levais tôt')
'Je me levais tôt'
>>> html.unescape('若き葉末には')
'若き葉末には'

В результате получается строка Unicode (введите str в Python 3).Обратите внимание, что запись b'...' предназначена для байтовых строк.Литерал b'\\u4e00' в вашем примере не имеет особого смысла, поскольку это байтовая строка из 6 символов (\, u, 4, e, 0, 0).Вы, вероятно, имели в виду '\u4e00' (или u'\u4e00' в Python 2), который представляет собой односимвольную строку Unicode.

...