我怎样才能让DOT正确处理UTF-8成PostScript并有多个图形/页?(How can I m

2019-09-27 09:09发布

这点源

graph A
{
    a;
}
graph B
{
    "Enûma Eliš";
}

当编译dot -Tps产生这个错误

警告:UTF-8输入使用不能由该PostScript驱动程序来处理非Latin1的字符

我可以通过传递固定UTF-8问题-Tps:cairo但那么只有曲线A是在输出-它被截断为单个页面。 同样的情况与-Tpdf 。 有可在我的安装没有其他PostScript驱动程序。

我可能分裂图形成单独的文件,之后将它们连接起来,但我宁愿不要。 有没有办法有正确的UTF-8处理和多页的输出?

Answer 1:

显然, dot PS驱动程序无法处理其他编码比老ISO8859-1。 我认为这不能改变字体,无论是。

有一两件事你可以做的是运行一个过滤器,以改变dot的PostScript输出。 下面的Perl程序这样做,它的一些代码,我有一个适应。 它改变从UTF-8编码的修饰的ISO编码具有额外字符替换未使用的。

当然,输出仍取决于具有所述字符的字体。 由于dot (我认为),只使用默认的PostScript字体,任何超出“标准拉丁”是出了问题?

它的工作原理使用Ghostscript或定义任何解释AdobeGlyphList

该过滤器应采用这种方式:

dot -Tps graph.dot | perl reenc.pl > output.ps

这里是:

#!/usr/bin/perl

use strict;
use warnings;
use open qw(:std :utf8);

my $ps = do { local $/; <STDIN> };
my %high;
my %in_use;
foreach my $char (split //, $ps) {
    my $code = (unpack("C", $char))[0];
    if ($code > 127) {
        $high{$char} = $code;
        if ($code < 256) {
            $in_use{$code} = 1;
        }
    }
}
my %repl;
my $i = 128;
foreach my $char (keys %high) {
    if ($in_use{$high{$char}}) {
        $ps =~ s/$char/sprintf("\\%03o", $high{$char})/ge;
        next;
    }
    while ($in_use{$i}) { $i++; }
    $repl{$i} = $high{$char};
    $ps =~ s/$char/sprintf("\\%03o", $i)/ge;
    $i++;
}
my $psprocs = <<"EOPS";
/EncReplacements <<
  @{[ join(" ", %repl) ]}
>> def
/RevList AdobeGlyphList length dict dup begin
  AdobeGlyphList { exch def } forall
end def
% code -- (uniXXXX)
/uniX { 16 6 string cvrs dup length 7 exch sub exch
  (uni0000) 7 string copy dup  4 2 roll putinterval } def
% font code -- glyphname
/unitoname { dup RevList exch known
  { RevList exch get }
  { uniX cvn } ifelse
  exch /CharStrings get 1 index known not
  { pop /.notdef } if
} def
/chg-enc { dup length array copy EncReplacements
  { currentdict exch unitoname 2 index 3 1 roll put } forall
} def
EOPS

$ps =~ s{/Encoding EncodingVector def}{/Encoding EncodingVector chg-enc def};
$ps =~ s/(%%BeginProlog)/$1\n$psprocs/;

print $ps;


Answer 2:

生成PDF或SVG可以绕过编码的问题太多。

dot  -Tpdf  chs.dot > chs.pdf

// or

dot  -Tsvg  chs.dot > chs.svg


文章来源: How can I make DOT correctly process UTF-8 to PostScript and have multiple graph/pages?