Java 为什么欧洲符号打印为Ôé¼;?

Java 为什么欧洲符号打印为Ôé¼;?,java,printing,epson,Java,Printing,Epson,我有一个Epson tm-t20,配置了代码页858。我做了一个测试打印的代码页和字符是好的。Java类是UTF-8编码的。我正在尝试打印一些文本,其中包含已命名代码页中的字符,如é、ç和€ 打印机与以下文件兼容: Arrays.stream(service.getSupportedDocFlavors()).forEach(f->System.out.println(f.getMediaType()+":"+f.getMimeType()+":"+f.getRepresentationC

我有一个Epson tm-t20,配置了代码页858。我做了一个测试打印的代码页和字符是好的。Java类是UTF-8编码的。我正在尝试打印一些文本,其中包含已命名代码页中的字符,如éç

打印机与以下文件兼容:

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);
}

你知道会出什么问题吗

这是编码问题。平台的默认字符集必须将欧元符号视为垃圾字符。 作为预防措施,您需要通过这些读写操作传递字符集。 阅读本文:
这是编码问题。平台的默认字符集必须将欧元符号视为垃圾字符。 作为预防措施,您需要通过这些读写操作传递字符集。 阅读本文:

您应该能够使用尝试2,但有一个更改:在使用
字符集时。对于name
,您不应该将UTF-8作为字符集传递,而应该传递
“Cp858”
(由Java文档提供)。编码应该基于打印机期望的代码页,并且Java源代码是UTF-8这一事实与此转换无关。

您应该能够使用尝试2,但有一个更改:当使用
字符集时。对于name
,您不应该将UTF-8作为字符集传递,而应该将
Cp858
(由Java文档提供)。编码应基于打印机期望的代码页,并且Java源代码为UTF-8这一事实与此转换无关。

这是编码问题。如果要打印欧元符号和其他符号,则必须使用unicode

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

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

但是,请检查这个问题并查看andrewdotn的答案,答案解释得很好。

这是另一个问题。如果要打印欧元符号和其他符号,您必须使用unicode

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

System.out.println("\u20ac");
不过,检查一下这个问题,看看andrewdotn的答案,它确实解释得很好