无法在windows上使用Java打印服务API打印UTF8文档

无法在windows上使用Java打印服务API打印UTF8文档,java,Java,我一直在尝试在windows操作系统上使用Java打印服务API打印包含俄语字母的文本文档,但到目前为止运气不佳。打印机打印文件,但unicode字符会被弄乱 运行程序时,指定了VM参数-Dfile.encoding=utf8 下面是代码 我甚至试着把docFlavor改成 “应用程序/octet流;class=“java.io.InputStream” 并将inputStream传递给SimpleDoc()构造函数,但仍然是相同的问题 看起来,即使平台编码设置为UTF8,windows上的J

我一直在尝试在windows操作系统上使用Java打印服务API打印包含俄语字母的文本文档,但到目前为止运气不佳。打印机打印文件,但unicode字符会被弄乱

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

下面是代码
我甚至试着把docFlavor改成 “应用程序/octet流;class=“java.io.InputStream” 并将inputStream传递给SimpleDoc()构造函数,但仍然是相同的问题

看起来,即使平台编码设置为UTF8,windows上的Java打印服务也无法正确地对字节进行编码

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

我认为您需要在
UTF-8
中阅读俄语.txt,我认为由于文件包含
UTF-8
字符,但在
windows-1252
中读取(如果未在Java中指定默认编码),此转换可能会导致乱码

您可以使用
InputStreamReader
,它将字符集作为已读字符集(请参见下面的最后一个参数):


若需要字节[],那个么您需要从上面的读卡器推断转换它的方式,因为这些公开了基于
char
的读API(对于缓冲读卡器,还包括读线)

谢谢您的回复,我之前已经尝试过了。但是,如果您在窗口上看到打印机支持的样式,它会接收字节数组或输入流。我尝试使用UTF-8编码的输入流读取字节。实际上这不是必需的,因为JVM属性-Dfile.encoding已设置为UTF-8Ok那么,从读取器到字节[]的转换是你的问题吗?你能发布一个包含俄语字母的文本样本行吗..有点像从文件中读取的字节[]数组是UTF8格式的。这可以通过写入相同的字节[]来确认数组到临时文件。打开临时文件,可以看到该文件将包含俄文字符。忘记该文件即可。假设您使用俄文字符字符串str=new String(“цццПцц”)创建一个简单字符串,然后从中获取字节byte buff[]=str.getBytes(“UTF-8”)并发送字节[]对于打印服务,它会打印乱码字符,因此我尝试在字节数组之前写入一个BOM字符“\ufeff”,以向打印服务发出传入字节[]为UTF-8格式的信号。这也不起作用。
    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"
BufferedReader rd = new BufferedReader(new InputStreamReader(new FileInputStream(f), "UTF-8"));