后记中的unicode

时间:2008-11-06 22:58:01

标签: unicode postscript

无论如何在PostScript中使用unicode字符串(最有可能是UTF-8,但可能是任何编码)?

到目前为止,我一直在使用此功能将字体转换为Latin1编码:

/latinize {
  findfont
  dup length dict begin
  { 1 index /FID ne {def}{pop pop} ifelse }forall
  /Encoding ISOLatin1Encoding def
  currentdict
  end
  definefont pop
}bind def

/HelveLat /Helvetica latinize
/HelveLatbold /Helvetica-Bold latinize

但我真的不喜欢它。

2 个答案:

答案 0 :(得分:6)

不是真的或任何简单的“开箱即用”的方式。请参阅this FAQ entry for details

答案 1 :(得分:2)

这可能适合您的账单,也可能不适合您,但我写的解释器(xpost)使用Cairo的所有图形和字体功能,包括show。因此,无论开罗提供什么支持,xpost都不会妨碍。但是在你太兴奋之前,这是一个单人项目,并没有完全提供完整的Level-1 Postscript。

编辑:最新版本不支持此功能。 Here是最后一个版本(listing)。


这是show operator本身的C代码。

OPFN_ void show(state *st, object s) {
    char str[s.u.c.n+1];
    memcpy(str, STR(s), s.u.c.n); str[s.u.c.n] = '\0';
    //printf("showing (%s)\n", str);
    if (st->cr) {
        cairo_show_text(st->cr, str);
        cairo_surface_flush(st->surface);
        XFlush(st->dis);
    }
}

来自Cairo docs

  

cairo_show_text()

     

void cairo_show_text(cairo_t * cr,
                                                           const char * utf8);

     

一个绘图操作符,它根据当前的font_face,font_size(font_matrix)和font_options呈现的UTF-8字符串生成形状。

     

此函数首先计算文本字符串的一组字形。放置第一个字形,使其原点位于当前点。每个后续字形的原点与前一个字形的原点相差前一个字形的前进值。

     

在此调用之后,当前点将移动到下一个字形将放置在同一进程中的原点。也就是说,当前点将在最终字形的原点处偏移其前进值。这允许通过多次调用cairo_show_text()来轻松显示单个逻辑字符串。

     

注意:cairo_show_text()函数调用是cairo设计者称之为“玩具”文本API的一部分。它对于简短的演示和简单的程序很方便,但对于严肃的文本使用应用程序来说,预计它不足够。有关cairo中“真实”文本显示API的信息,请参阅cairo_show_glyphs()。

     

http://www.cairographics.org/manual/cairo-text.html#cairo-show-text

所以这是Postscript中的UTF-8,就像我想的那样! :)