在运行BIRT报告的Linux上缺少中文字符

时间:2013-07-02 20:38:12

标签: java unicode fonts birt

我正在尝试在BIRT的PDF报告上打印针叶樱桃提取物。相反它显示了针桃提取物,所以在PDF中缺少叶樱。这是一个字体问题,类似于this person's problem.但是,我们已经使用了sans-serif字体。那个人的解决方案在字体上有些不同。

有没有人知道在这种情况下在Linux上下文中使用的正确字体?

2 个答案:

答案 0 :(得分:7)

<强>问题

此字体问题不是由于serif / sans serif字体本身,而是由于字体未覆盖文本中的字符。未渲​​染的字符指的是'cherryblossom的叶子',是汉字(CJK unified ideographs)的一部分:

Glyph   Unicode code point   Represents                                              Code Block                 

叶      U+53F6               to harmonize, to rhyme; to unite; (borrowed for) leaf   CJK Unified (plane 5 stroke 5)
樱      U+6A31               cherry/cherryblossom                                    CJK Unified (plane 6 stroke 15)

http://www.fileformat.info/info/unicode/char/53f6/index.htm
http://www.fileformat.info/info/unicode/char/6a31/index.htm
http://www.decodeunicode.org/en/u+53f6/properties
http://www.decodeunicode.org/en/u+6A31/properties

unicode代码点是字符的“通用虚拟表示” - 它们不包含在您的文件中,也不会在屏幕上呈现。

过程如下:

Author's Head/        Virtual Space           Bytes In
Generating Tool --->  (Incl. Strings    --->  File        ---->  Screen/Printer
                       In Tool Memory)

Desired               Unicode             Character Encoded    Symbol Rendered Via 
Language Symbol       Code Point          Via Nominated        Nominated Font In  
                                          File Encoding        File

在Microsoft上,Arial掩盖了将字体与文本匹配的需要,因为Arial Unicode MS字体实际上是Arial字体以外的大型扩展 - 它包括大多数Microsoft代码页,包括this one,其中包含这两个字符。

现代Linux安装应该有支持字体。如果你没有,那么肯定没有中文功能。使用Ubuntu admin language support features解决此问题的示例。键入以下内容以发现匹配的字体:

xlsfonts | grep gb
xlsfonts | grep big5
xlsfonts | grep han
xlsfonts | grep ming
xlsfonts | grep song
xlsfonts | grep kai
  1. 下载适用于Linux的中文/亚洲字体

  2. 在Birt中配置字体路径

    在此步骤和下一步中更改fontsConfig.xml后,需要重新启动BIRT才能使更改生效。

    设置font-paths元素fontsConfig.xml;

    <font-paths>
         ---------------
         ---------------
         ---------------
          <path path="/var/font/truetype" />
    </font-paths>
    

    另请注意,块元素允许您指定字体仅适用于特定范围内的字符,允许动态切换不同文本的字体(对于多语言/多符号文本非常有用:

    <block name="Thai" start="e00" end="e7f" index="27" font-family="Font-Family"/>
    
  3. 在Birt中配置字体编码:

    同样在fontConfig.xml内,在font-encodings元素中,确保您的字体具有覆盖字符的适当字符编码。例如,选择以下选项之一:

    <font-encodings>
        <encoding font-family="STSong-Light" encoding="UniGB-UCS2-H" />
        <encoding font-family="STSongStd-Light" encoding="UniGB-UCS2-H" />
        <encoding font-family="MHei-Medium" encoding="UniCNS-UCS2-H" />
        <encoding font-family="MSung-Light" encoding="UniCNS-UCS2-H" />
        <encoding font-family="MSungStd-Light" encoding="UniCNS-UCS2-H" />
    </font-encodings>
    

    注意:包含的任何True Type字体都将嵌入PDF中,从而显着影响其大小,同时也确保所有客户端都能正确阅读文档。

    这些是Adobe编码,涵盖了大部分/全部更广泛的GB10380字符集,而不是旧的GB2312集(或EUC-CN),这对您来说太窄了。上面的例子来自BIRT论坛,但是一个小小的警告,Adobe已经弃用了UCS2 - 你可以用“UTF16”替换字符串中的“UCS2”。

    使用Adobe编码的原因:Adobe被认为是跨平台编码广泛CJK字符的标准。历史上很少有系统直接支持GB10380字符集。 此外,许多打印机都支持Adobe编码和字体 - 这是一个重要因素。默认的Linux字符集/编码可能不支持您的需求,但您可以尝试参考可用的Linux编码:

    • 可用的字符集(编码):locale -ccharsets                                 (或角色地图程序的Gnome版本)

    • 可用的Linux区域设置:locale -a

    • 当前Linux区域设置:locale
    • 当前默认字符集:locale charset

答案 1 :(得分:0)

在debian上我安装了一大堆中文和其他亚洲字体,以确保不会再发生这种情况,因为我会生成数千种各种字符集的PDF格式。

这些是我安装的字体:

ttf-arphic-bkai00mp ttf-arphic-bsmi00lp ttf-arphic-gbsn00lp ttf-arphic-gbsn00lp ttf-arphic-gkai00mp ttf-arphic-ukai ttf-arphic-uming ttf-kochi-gothic ttf-kochi-mincho ttf- BAEKMUK

我建议你逐个安装/卸载它们,看看你需要哪一个。关于一篇非常好的Debian文章的参考:all Chinese fonts in Debian