我正在制作一个使用财务打印机的应用程序,并且发送到打印机的文档必须使用西里尔字母。问题在于,应该将一个特定字符(因为我想打印一张收据,所以要归为关税集团的一个特定字符)为(char)192
,但是在此过程中以某种方式将其更改为某种随机字符。我尝试将项目的编码更改为“项目”>“属性”>“资源”>“文本文件编码”下的UTF-8,并且没有任何更改。我还尝试将“窗口”>“首选项”>“常规”>“工作区”>“文本文件编码”中的编码更改为UTF-8,还是一无所获。
注意:当我在其他计算机上手动键入文档,然后将其发送到财务打印机时,它可以正常工作(但在我的PC上却不行)。我使用记事本编辑文件,输出文件类型为.in。
这是代码
if(result==JOptionPane.YES_OPTION){
try {
PrintWriter writer;
writer = new PrintWriter("PF500.in");
String line1 = " 01,0000,1";
writer.println(line1);
String etq = "#1";
String line2 = null;
String tarifa = null;
for(Artikli art : list){
switch(etq){
case "#1": etq = "$1";
break;
default: etq = "#1";
}
switch(art.tarifa){
case "0801": tarifa = Character.toString((char)192);
break;
case "0701": tarifa = Character.toString((char)193);
break;
case "0601": tarifa = Character.toString((char)194);
break;
}
line2 = etq + art.name.trim() + Character.toString((char)9) + tarifa + art.cena + "*" + art.kolicina;
writer.println(line2);
}
writer.println("%5" + Character.toString((char)9) + "P" + String.valueOf(total));
writer.println("#" + Character.toString((char)56));
writer.close();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
con.clearSmetka(id);
con.insertIzvestaj(list, den.date, id, user.name, time, popust);
dtm1.setRowCount(0);
smetkaTable.setModel(dtm1);
btnCloseSmetka.setEnabled(false);
btn.setBackground(new Color(0, 128, 128));
btn.setText("Маса " + String.valueOf(id));
smetkaTxt.setText("0,00");
workFrame.dispose();
}
除了费率组的字符((char)192)以外,其他所有内容都可以正常工作
答案 0 :(得分:1)
问题:
在
writer = new PrintWriter("PF500.in");
创建了PrintWriter
这意味着在
writer.println(line2);
包含子字符串line2
(与"À"
或"\u00c0"
相同的字符串Character.toString((char)192)
被转换为基于默认字符集的字节/编码(其本身取决于操作系统的语言设置)。
解决方案:
192
而不进行转换,您可以使用FileOutputStream
代替PrintWriter
和方法write(int b)
:< / li>
FileOutputStream writer = new FileOutputStream("PF500.in");
...
writer.write('\u00c0');
如果您想继续使用 PriterWriter
,则必须指定打印机使用的编码/字符集:{{ 3}}。
在通过 -Dfile.encoding=...
运行Java时指定打印机的字符集/编码(这可能会导致其他地方的编码问题)。
作为第四个选项(不建议使用,它可能会起作用或可能不会起作用),您可以先进行逆转换:
case "0801": tarifa = new String(new byte[]{(byte)192});
答案 1 :(得分:0)
您可以直接写您想要的字符来代替:tarifa = Character.toString((char)192);
打印字符串时,它的构造方式和构造方式完全不相关。 Java字符串的内部字符表示形式与创建字符串时使用的编码或从字符串中获取原始数据时使用的编码无关。创建tarifa = "À";
时,将使用对系统使用默认编码的构造函数。这种编码是这里的关键。无论该编码是什么,它显然都与您的财务打印机不兼容。您应该找出打印机期望的编码,然后使用该编码专门构造PrintWriter
:
PrintWriter
答案 2 :(得分:0)
解决方案
好吧,所以一段时间后,我终于找到了问题:在这里,我用Writer更改了PrintWriter,并在下面的行中将FileOutputStream的编码设置为“ Cp1252”:
Writer writer = new BufferedWriter(new OutputStreamWriter( 新的FileOutputStream(“ PF500.in”),“ Cp1252”)); 现在工作正常。事实证明,由于我仍然未知的原因,该文件使用utf-8编码保存,并且财务打印机无法识别所有字符,因此收据有问题。将编码更改为“ Cp1252”后,该过程运行良好。