无法在windows上使用Java打印服务API打印UTF8文档
我一直在尝试在windows操作系统上使用Java打印服务API打印包含俄文字母的文本文档,但到目前为止运气不佳。打印机打印文件,但unicode字符会被弄乱
运行程序时,VM参数-Dfile。已指定编码=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改成 “应用程序/八位字节流;^{cl 1}”$
看起来,即使平台编码设置为UTF8,windows上的Java打印服务也无法正确地对字节进行编码
是否有任何设置需要执行或纠正? 任何建议都会大有裨益
# 1 楼答案
我想你需要读俄语。txt在
UTF-8
中,我认为由于文件包含UTF-8
字符,但在windows-1252
中读取(如果在Java中未指定默认编码),此转换可能会导致乱码您可以使用
InputStreamReader
,它将字符集作为读取(请参见下面的最后一个参数):如果需要字节[],那么您需要从上面的读卡器推断转换它的方法,因为这些公开了基于
char
的读API(对于缓冲读卡器,还包括读线)