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

用Java打印数学符号会产生错误的输出,java,unicode,printing,Java,Unicode,Printing,我正在尝试使用TextLayout类打印。当我打印一些数学符号时,我会有奇怪的行为 下图显示了将字符串“First+2”和“First\u222A 2”打印到PDF文件的结果。打印“union”符号(\u222A)时,符号后面的字符似乎覆盖了符号前面的字符 以下是打印不包含\u222A的字符串和另一个包含以下内容的字符串的测试代码: public class PrintTest { public static void main(String[] args) { PrinterJob

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

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

以下是打印不包含\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());
        }
    }
}
}

我在Windows7和8上运行Java1.7.0_17,并在多台打印机上进行了测试,包括打印到PDF。所有测试都显示了相同的问题。对于“并集”、“交集”和“排除”符号,我得到了相同的结果

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

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


这为我解决了眼前的问题,因为我不习惯使用逻辑字体。

事实上,您一直在打印Unicode字符;您的帖子标题表明您正在打印Unicode以外的内容。所有正确打印的字母字符都是用Unicode编码的,因为Java就是这样编码字符串的


因此,您试图打印“联合”符号,但它不起作用。您有什么证据表明您正在打印的打印机支持该功能?您尝试过的任何打印机都可能不支持它,因此会出现不可预知的行为。这是最明显的原因。

联合字符被打印出来,但它后面的字符被打印在它前面的字符上。好的,我同意这很奇怪,这表明我不熟悉一个问题。但在寻求帮助时,不要将其他字符称为“非Unicode”,因为这是不正确的。您使用的是一个不太常用的Unicode字符,它会导致看起来像立即回车的字符(没有换行符)。我不知道怎么办。如果您有任何其他方法将此字符输出到此打印机,这些结果将非常有趣。您可以尝试使用一个特殊的驱动程序(如cutePdf)打印到一个文件中,看看它能做什么。祝你好运。谢谢你的输入。我修改了标题和文本以反映您的评论。我还附上了一张我在给Nitro PDF Creator写信时得到的输出图片,并没有回答;应该作为评论发布。