使用PHP生成带有unicode字符的SVG,以包含在Inkscape中

时间:2015-05-10 06:54:23

标签: php svg encoding utf-8 inkscape

我必须制作一些PDF日历,因此我决定使用PHP在SVG中创建大部分时间来自动化该过程,保存结果并将其导入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”,我不知道它来自哪里,而如果我保存结果页面并用文本编辑器Kate打开它我看到编码是ISO-8859-15,文件中正确显示“ì”。

如果我从控制台(less file.svgXTERM_LOCALE=it_IT.utf8)检查保存的文件,我看到“ì”被倒置的<EC>十六进制代替。 U + 00EC是“带有坟墓的拉丁文小写字母”,所以至少它是正确的。

如果我从Kate重新保存页面,强制编码为UTF-8,Inkscape很乐意接受它。

如果我尝试用html实体替换“ì”&igrave; Inkscape不会显示字形。

问题是:如何将在Firefox上看到的页面保存为UTF-8?似乎Firefox不允许像Kate那样更改文件的编码。

0 个答案:

没有答案