Мне нужно было сделать несколько календарей PDF, поэтому я решил автоматизировать процесс, создав большую часть дней в SVG с PHP, сохранив результат и импортировав его в Inkscape для дальнейшей графики.
Обычно эта процедура работает гладко, и я много раз использовал ее для графиков, диаграмм и т. Д., Но теперь у меня возникла проблема с символами utf-8, которые мне раньше никогда не приходилось использовать.
Это основной код PHP:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="1200" height="3600" xmlns="http://www.w3.org/2000/svg" encoding="UTF-8">
<?php
$FontSize = 16;
$LineHeight = $FontSize * 1.5;
$DefaultColor = '000000';
$Y = $LineHeight;
date_default_timezone_set('Europe/Rome');
setlocale(LC_TIME, "it_IT.utf8");
for ($mese=1; $mese<=12; $mese++) {
$M = strftime('%B', strtotime("$mese/1/2016"));
echo "<g id=\"$M\">\n";
echo "<text x=\"0\" y=\"$Y\" style=\"font-size:{$FontSize}px;fill:#000000;fill-opacity:1;stroke-width:0\">$M</text>\n";
$Y = $Y + $LineHeight;
for ($giorno=1; $giorno<=cal_days_in_month(CAL_GREGORIAN, $mese, 2016); $giorno++) {
$G =utf8_decode(strftime('%A', strtotime("$mese/$giorno/2016")));
$D = strftime('%e', strtotime("$mese/$giorno/2016"));
if (strftime('%u', strtotime("$mese/$giorno/2016"))==7) {
$colore = 'ff0000';
} else {
$colore = $DefaultColor;
}
echo "<text x=\"10\" y=\"$Y\" style=\"font-size:{$FontSize}px;fill:#{$colore};fill-opacity:1;stroke-width:0\">$D</text>\n";
echo "<text x=\"40\" y=\"$Y\" style=\"font-size:{$FontSize}px;fill:#{$colore};fill-opacity:1;stroke-width:0\">$G</text>\n";
$Y = $Y + $LineHeight;
}
$Y = $Y + $LineHeight;
echo "</g>\n";
}
?>
</svg>
Вывод SVG (фрагмент):
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="1200" height="3600" xmlns="http://www.w3.org/2000/svg" encoding="UTF-8">
<g id="gennaio">
<text x="0" y="24" style="font-size:16px;fill:#000000;fill-opacity:1;stroke-width:0">gennaio</text>
<text x="10" y="48" style="font-size:16px;fill:#000000;fill-opacity:1;stroke-width:0"> 1</text>
<text x="40" y="48" style="font-size:16px;fill:#000000;fill-opacity:1;stroke-width:0">venerdì</text>
<text x="10" y="72" style="font-size:16px;fill:#000000;fill-opacity:1;stroke-width:0"> 2</text>
<text x="40" y="72" style="font-size:16px;fill:#000000;fill-opacity:1;stroke-width:0">sabato</text>
<text x="10" y="96" style="font-size:16px;fill:#ff0000;fill-opacity:1;stroke-width:0"> 3</text>
<text x="40" y="96" style="font-size:16px;fill:#ff0000;fill-opacity:1;stroke-width:0">domenica</text>
<text x="10" y="120" style="font-size:16px;fill:#000000;fill-opacity:1;stroke-width:0"> 4</text>
<text x="40" y="120" style="font-size:16px;fill:#000000;fill-opacity:1;stroke-width:0">lunedì</text>
На экране все работает плавно.
Однако когда в Firefox я сохраняю сгенерированную страницу, кодировка utf-8 теряется, и Inkscape не может справиться с этим. Каждое окончательное «ì» итальянских названий дней заменяется длинной строкой неопределенных символов.
Когда я проверяю «информацию о странице» из Firefox, я вижу кодировку «Windows-1252», и я не знаю, откуда она берется, а если я сохраню полученную страницу и открою ее с помощью текстового редактора Кейт, я увижу кодировка ISO-8859-15, и в файле правильно отображаются символы «ì».
Если я проверю сохраненный файл из консоли (less file.svg
, с XTERM_LOCALE=it_IT.utf8
) Вижу «м» заменены на перевернутые <EC>
hexcodes. U + 00EC — это «МАЛЕНЬКОЕ ЛАТИНСКОЕ ПИСЬМО I С МОЩЬЮ», так что, по крайней мере, это правильно.
Если я заново сохраню страницу из Kate, принудительно введя кодировку в UTF-8, Inkscape с радостью примет это.
Если я попытаюсь заменить «М» на HTML-сущности ì
Inkscape не показывает глиф.
Вопрос в том: Как я могу сохранить страницу в Firefox как UTF-8? Похоже, Firefox не позволяет изменять кодировку файлов, как это делает Кейт.
Задача ещё не решена.
Других решений пока нет …