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

Yis*_*hai 1 java unicode fonts birt

我想在BIRT的PDF报告上打印针叶樱桃提取物.相反它显示了针桃提取物,所以在PDF中缺少叶樱.这是一个字体问题,类似于这个人的问题.但是,我们已经使用了sans-serif字体.该人的解决方案是字体的一些差异.

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

Gle*_*est 7

问题

此字体问题不是由于serif/sans serif字体本身,而是由于字体未覆盖文本中的字符.未提及的字符指的是"樱花的叶子",是汉字(CJK统一表意文字)的一部分:

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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

xlsfonts | grep gb
xlsfonts | grep big5
xlsfonts | grep han
xlsfonts | grep ming
xlsfonts | grep song
xlsfonts | grep kai
Run Code Online (Sandbox Code Playgroud)
  1. 下载适用于Linux的中文/亚洲字体

  2. 在Birt中配置字体路径

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

    设置font-pathsfontsConfig.xml元素;

    <font-paths>
         ---------------
         ---------------
         ---------------
          <path path="/var/font/truetype" />
    </font-paths>
    
    Run Code Online (Sandbox Code Playgroud)

    还请注意,块元素,可以指定字体仅适用于字符在一定范围内,从而允许不同的文字字体的动态切换为多语言/多符号文本(有用:

    <block name="Thai" start="e00" end="e7f" index="27" font-family="Font-Family"/>
    
    Run Code Online (Sandbox Code Playgroud)
  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>
    
    Run Code Online (Sandbox Code Playgroud)

    注意:包含的任何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