用Java打印数学符号会产生错误的输出

时间:2013-05-06 01:47:49

标签: java unicode printing

我正在尝试使用TextLayout类进行打印。当我打印一些数学符号时,我会得到奇怪的行为。

下图显示了将字符串“First + 2”和“First \ u222A 2”打印到PDF文件的结果。打印'union'符号(\ u222A)时,符号后面的字符会在符号前覆盖字符。

enter image description here

这是测试代码,它打印一个不包含\ u222A的字符串和另一个字符串:

public class PrintTest {

public static void main(String[] args) {
    PrinterJob pj = PrinterJob.getPrinterJob();

    pj.setPrintable(new Printable() {
        public int print(Graphics g, PageFormat pf, int pageIndex) {
            if (pageIndex != 0) return NO_SUCH_PAGE;

            Graphics2D g2 = (Graphics2D) g;
            Font font = new Font("SansSerif", Font.PLAIN, 10);

            // Draw string with + char
            TextLayout layout = new TextLayout("First + 2", font, g2
                    .getFontRenderContext());
            layout.draw(g2, 40, 80);

            // Draw string with union character
            layout = new TextLayout("First \u222A 2", font, g2
                    .getFontRenderContext());
            layout.draw(g2, 40, 100);

            return PAGE_EXISTS;
        }
    });

    if (pj.printDialog()) {
        try {
            pj.print();
        } catch (PrinterException e) {
            System.out.println(e.getMessage());
        }
    }
}

}

我正在Windows 7上运行java 1.7.0_17& 8,并在几台打印机上测试了这一点,包括打印到PDF。所有测试都显示同样的问题。我使用'union','intersection'和'exclusion'符号获得相同的结果。

我真的被困在这里了。任何帮助将不胜感激。

更新:使用逻辑字体时似乎出现问题。我测试了所有已安装的逻辑字体('Dialog','DialogInput','Monospaced,'SansSerif'和'Serif')并遇到了同样的问题。当我使用支持这些符号的物理字体('Lucida Sans'和'Arial Unicode MS')进行测试时,我得到了所需的输出。

enter image description here

这解决了我的直接问题,因为我不喜欢使用逻辑字体。

1 个答案:

答案 0 :(得分:-1)

实际上,您一直在打印Unicode字符;你的帖子的标题建议你打印除Unicode以外的东西。您正确打印的所有字母字符都以Unicode编码,因为这就是Java编码字符串的方式。

所以你试图打印“联盟”符号,它不起作用。您有什么证据表明您打印的打印机支持它?您尝试过的任何打印机都可能不支持它,因此行为不可预测。这是最显而易见的事情。