Jul. 3rd, 2018

vitus_wagner: My photo 2005 (Default)
Дано: 3-й питон, юникодная строка, примерно до миллиона символов длиной.
Надо: преобразовать эту строку в произвольную 8-битную кодировку, заменяя все символы, отсутствубщие в данной кодировке на html-ные entities.

Как это быстрее всего сделать?

По идее питоновский стиль это "попытаться преобразовать, получить исключение, обработать".
Собственно, так и написал:
from html.entities import codepoint2name

complete=False
while not complete:
    try:
        binary=data.encode(output_encoding)
        out += binary
        complete=True
    except UnicodeEncodeError as e:
        badchar = data[e.start]
        out +=data[:e.start].encode(output_encoding)
        data=data[e.start+1:]
        if ord(badchar) in codepoint2name:
            out+=b'&'+codepoint2name[ord(badchar)].encode("ascii")+b';';
        else:
            out+=b"&#%d;"%ord(badchar);


Но что-то скорость работы этой конструкции мне не нравится (даже на довольно быстрой моей рабочей станции миллион символов из которых только 7200 не представлены в целевой кодировке, жует 0.9 секунды).

Какие еще способы решения этой задачи можно предложить?

Profile

vitus_wagner: My photo 2005 (Default)
vitus_wagner

May 2025

S M T W T F S
    1 2 3
4 56 7 8 9 10
11 12 131415 1617
1819202122 2324
252627 282930 31

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 1st, 2025 06:01 am
Powered by Dreamwidth Studios