gpt4 book ai didi

java - 无法在 Windows 上使用 Java Print Service API 打印 UTF8 文档

转载 作者:行者123 更新时间:2023-11-30 11:33:13 24 4
gpt4 key购买 nike

我一直在尝试在 Windows 操作系统上使用 Java Print Service API 打印包含俄文字母的文本文档,但到目前为止还没有成功。打印机打印文件,但 unicode 字符出现乱码。

在运行程序时,指定了 VM 参数 -Dfile.encoding=utf8

代码如下

    import java.io.DataInputStream;  
import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Sides;


public class PrintUtf8Doc {


public static void main(String[] args) throws UnsupportedEncodingException {
FileInputStream textstream=null;
DataInputStream da=null;
byte buff[]=new byte[1024*20];

try {
textstream = new FileInputStream("D:\\test\\russian.txt");
da=new DataInputStream(textstream);
da.read(buff);

} catch (Exception e) {
e.printStackTrace();
}
if (textstream == null) {
return;
}
// Set the document type

DocFlavor myFormat = DocFlavor.BYTE_ARRAY.AUTOSENSE;


// Create a Doc
Doc myDoc = new SimpleDoc(buff, myFormat, null);
// Build a set of attributes
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(Sides.DUPLEX);

System.out.println("Host Encoding: "+myFormat.hostEncoding);


PrintService service = PrintServiceLookup.lookupDefaultPrintService();
DocFlavor flavs[]=service.getSupportedDocFlavors();
for(DocFlavor flavor: flavs){
System.out.println(flavor.toString());
}

// Create a print job from one of the print services
if (service!=null) {

DocPrintJob printJob=service.createPrintJob();
try {
printJob.print(myDoc, aset);
} catch (PrintException e) {
e.printStackTrace();
}

}

}
}

-------------------------------------------------------------------
The supported flavors are printed in the console

Host Encoding: UTF8
image/gif; class="[B"
image/gif; class="java.io.InputStream"
image/gif; class="java.net.URL"
image/jpeg; class="[B"
image/jpeg; class="java.io.InputStream"
image/jpeg; class="java.net.URL"
image/png; class="[B"
image/png; class="java.io.InputStream"
image/png; class="java.net.URL"
application/x-java-jvm-local-objectref; class="java.awt.print.Pageable"
application/x-java-jvm-local-objectref; class="java.awt.print.Printable"
application/octet-stream; class="[B"
application/octet-stream; class="java.net.URL"
application/octet-stream; class="java.io.InputStream"

我什至尝试将 docFlavor 更改为“应用程序/八位字节流;类=”java.io.InputStream”并将 inputStream 传递给 SimpleDoc() 构造函数,但仍然是同一个问题

看起来即使平台编码设置为 UTF8,Windows 上的 Java Print Service 也无法正确编码字节。

是否有任何设置需要完成或更正?任何建议都会有很大帮助

最佳答案

我认为您需要以 UTF-8 格式阅读 russian.txt,我认为因为该文件包含 UTF-8 字符但在 windows 中读取- 1252(如果没有在Java中指定默认编码)这种转换可能会导致乱码。

您可以使用 InputStreamReader 读取字符集(参见下面的最后一个参数):

BufferedReader rd = new BufferedReader(new InputStreamReader(new FileInputStream(f), "UTF-8"));

如果需要 byte[] 那么你需要推断出从上面的阅读器转换它的方法,因为这些公开了基于 char 的读取 API(以及 readLine 以及缓冲阅读器的情况)

关于java - 无法在 Windows 上使用 Java Print Service API 打印 UTF8 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16185566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com