При объединении файлов SVG с помощью svgutils слетает кириллица
У меня есть 2 SVG файла. В одном из них (петля мебиуса) текст написан кириллицей. Когда объединяю его с другим SVG (со штрих кодом) и открываю получившийся SVG, то текст кириллицей превращается в абракадабру (слетает кодировка?).
import svgutils.transform as sg
import sys
import re
MEBIUS = sg.fromfile('Mebius.svg')
CODE_EAN13 = sg.fromfile('EAN13.svg')
root = logo.getroot()
root.moveto(60, 375, scale_x=2)
background.append([root])
background.save('output.svg')
output.svg в итоге выглядит так: https://i.stack.imgur.com/gD8ST.png
Вот как выглядит mebius в оригинале: https://i.stack.imgur.com/JKgM2.png
UPD: Пробовала поставить #coding=utf-8.Не помогло. Сделала print('2.svg', 'r'), оказалось:
<_io.TextIOWrapper name='2.svg' mode='r' encoding='cp1251'>
Стала смотреть на конфигурацию файлов SVG. Исходный mebius:
<?xml version="1.0" encoding="utf-8" ?>
Финальный файл output SVG:
<?xml version='1.0' encoding='ASCII' standalone='yes'?>
Также в финальном файле текст "фффф" отображается как фффф
Нагуглила, что это html-entities. Если его перевести в СР1251, затем в UTF - 8, то получим исходные "фффф"
Ответы (1 шт):
Ура! Решила!
Шаг 1. Задаём для output.svg формат ср1251
background.save('output.svg', encoding='cp1251')
Если после первого шага зайти в код файла output, то увидим, что переменная, отвечающая за кириллицу, отображается корректно:
>ТЕКСТ ЗДЕСЬ</text>
Но при этом в первой строке с кодировкой стоит оторый не считывается ни браузером, ни графическим редактором. encoding='cp1251' standalone='yes'?>,
Если задавать кодировку utf-8, то наш SVG откроется и в браузере, и в иллюстраторе (Adobe Illustrator), но в тексте будет появляться абракадабра >укеукпу</text>
Шаг 2. Ипортируем кодаки
import codecs
Шаг 3. Открываем только что созданный SVG и читаем его в кодировке utf-8
При этом с помощью replace меняем 'cp1251' на 'utf-8'. Получается, что файле SVG мы убираем название переменной encoding, но оставляем правильное отображение текста
f = codecs.open('output.svg', 'r', 'utf-8')
u = f.read()
u = u.replace('cp1251','utf-8')
out = codecs.open('output.svg', 'w', 'utf-8')
out.write(u)
print(u)
Готово!)
Итоговый код:
import svgutils.transform as sg
import sys
import re
import codecs
background = sg.fromfile('Mebius.svg')
logo = sg.fromfile('Baracode.svg')
root = logo.getroot()
# Top Left
root.moveto(60, 375, scale_x=2)
background.append([root])
background.save('output.svg', encoding='cp1251')
f = codecs.open('output.svg', 'r', 'utf-8')
u = f.read()
u = u.replace('cp1251','utf-8')
out = codecs.open('output.svg', 'w', 'utf-8')
out.write(u)
print(u)
