为什么将欧元符号打印为Ôé¼?

时间:2018-07-01 17:42:41

标签: java printing epson

我有一个配置了代码页858的Epson tm-t20。我对代码页进行了测试打印,字符很好。 Java类是UTF-8编码的。我正在尝试在已命名的代码页中显示一些带有éç的字符的文本。

打印机与以下Docflavor兼容:

Arrays.stream(service.getSupportedDocFlavors()).forEach(f->System.out.println(f.getMediaType()+":"+f.getMimeType()+":"+f.getRepresentationClassName()));

image:image/gif:[B
image:image/gif:java.io.InputStream
image:image/gif:java.net.URL
image:image/jpeg:[B
image:image/jpeg:java.io.InputStream
image:image/jpeg:java.net.URL
image:image/png:[B
image:image/png:java.io.InputStream
image:image/png:java.net.URL
application:application/x-java-jvm-local-objectref:java.awt.print.Pageable
application:application/x-java-jvm-local-objectref:java.awt.print.Printable
application:application/octet-stream:[B
application:application/octet-stream:java.net.URL
application:application/octet-stream:java.io.InputStream

到目前为止,我已经尝试过:

尝试1:与InputStream

public static void print(){
  InputStream bytes = new ByteArrayInputStream(("Estó ès una pruebà \r\n Hola qu€ tal").getBytes());    
  PrintService service = PrintServiceLookup.lookupDefaultPrintService();
  DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
  DocPrintJob pj = service.createPrintJob();
  Doc doc = new SimpleDoc(bytes, flavor, null);
  pj.print(doc, null);
}

输出:

Estó ès una pruebà
Hola quÔé¼ tal

后继2:,带有字节[],输出相同

 public static void print(){
    byte[] bytes = new String("Estó ès una pruebà \r\n Hola qu€ tal").getBytes(Charset.forName("UTF-8"));
    PrintService service = PrintServiceLookup.lookupDefaultPrintService();
    DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
    DocPrintJob pj = service.createPrintJob();
    Doc doc = new SimpleDoc(bytes, flavor, null);
    pj.print(doc, null);
}

有什么主意吗?

3 个答案:

答案 0 :(得分:2)

这是一个迫在眉睫的问题。如果要打印欧元符号和其他符号,则必须使用unicode。

使用unicode打印欧元符号的示例

System.out.println("\u20ac");

但是,请检查此问题Displaying euro symbol using unicode and changing characters to uppercase并看一看安德鲁顿的答案,它的解释确实很好。

答案 1 :(得分:1)

您应该能够使用尝试2进行一次更改:使用Charset.forName时,您不应传递UTF-8作为字符集,而应传递"Cp858"(由{{3}给予) } Java文档)。编码应基于打印机期望的代码页,并且Java源为UTF-8的事实与此转换无关。

答案 2 :(得分:0)

这是编码问题。平台的默认字符集必须将欧元符号视为垃圾字符。 为了预防起见,您需要将这些读写操作传递给字符集。 阅读本文: https://www.geeksforgeeks.org/java-io-inputstreamreader-class/