为什么欧元符号打印为Ôé¼?
Why euro symbol printing as Ôé¼?
我有一台 Epson tm-t20 配置了代码页 858。我对代码页进行了打印测试,字符没问题。 Java class 是 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);
}
知道哪里出了问题吗?
编码 issue.Platform 的默认字符集必须将欧元符号视为垃圾字符。
作为预防措施,您需要将字符集与这些读写操作一起传递。
阅读这篇文章:
https://www.geeksforgeeks.org/java-io-inputstreamreader-class/
您应该可以使用尝试 2,但有一处更改:当使用 Charset.forName
时,您不应将 UTF-8 作为字符集传递,而是 "Cp858"
(由 supported encodings Java 的文档)。编码应基于打印机期望的代码页,Java 源是 UTF-8 的事实与此转换无关。
这是后续问题。如果要打印欧元符号和其他符号,则必须使用 unicode。
使用 unicode 打印欧元符号的示例
System.out.println("\u20ac");
但是,检查这个问题Displaying euro symbol using unicode and changing characters to uppercase并看看andrewdotn的答案,解释得很好。
我有一台 Epson tm-t20 配置了代码页 858。我对代码页进行了打印测试,字符没问题。 Java class 是 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);
}
知道哪里出了问题吗?
编码 issue.Platform 的默认字符集必须将欧元符号视为垃圾字符。 作为预防措施,您需要将字符集与这些读写操作一起传递。 阅读这篇文章: https://www.geeksforgeeks.org/java-io-inputstreamreader-class/
您应该可以使用尝试 2,但有一处更改:当使用 Charset.forName
时,您不应将 UTF-8 作为字符集传递,而是 "Cp858"
(由 supported encodings Java 的文档)。编码应基于打印机期望的代码页,Java 源是 UTF-8 的事实与此转换无关。
这是后续问题。如果要打印欧元符号和其他符号,则必须使用 unicode。
使用 unicode 打印欧元符号的示例
System.out.println("\u20ac");
但是,检查这个问题Displaying euro symbol using unicode and changing characters to uppercase并看看andrewdotn的答案,解释得很好。