Eclipse 打印错误的西里尔字符
Eclipse printing wrong cyrillic character
我正在制作一个使用财务打印机的应用程序,我发送到打印机的文档必须是西里尔文。问题是一个特定字符(一个用于关税组,因为我正在尝试打印收据)应该是 (char)192
,但不知何故在这个过程中被更改为一些随机字符。我尝试在项目>属性>资源>文本文件编码下将项目的编码更改为 UTF-8,但没有任何改变。我也尝试将 Window>Preferences>General>Workspace>Text file encoding 中的编码更改为 UTF-8,但仍然没有。
注意:当我在其他机器上手动输入文档然后将其发送到财务打印机时它工作正常(但不是在我的电脑上)。我使用记事本编辑文件,输出文件类型为.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 = "";
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)外,一切正常
不用写tarifa = Character.toString((char)192);
,反正超级费解,直接写你想要的字符:tarifa = "À";
当您打印一个字符串时,它是如何构建的以及您使用什么编码来构建它是完全无关的。 Java 字符串有一个内部字符表示,它独立于您在创建它们时使用的编码或您在从它们获取原始数据时使用的编码。当您创建 PrintWriter
时,您使用了一个使用系统默认编码的构造函数。该编码是这里的症结所在。无论编码是什么,它显然与您的财务打印机不兼容。您应该找出打印机期望的编码,然后使用该编码具体构造您的 PrintWriter
:
writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream("PF500.in"), "CHARSET_NAME"));
问题:
在
writer = new PrintWriter("PF500.in");
创建了一个PrintWriter
这意味着在
writer.println(line2);
包含子字符串 "À"
(与 "\u00c0"
或 Character.toString((char)192)
相同)的字符串 line2
转换为字节基于默认 charset/encoding(这本身取决于操作系统的语言设置)。
解决方案:
- 要直接写入字节
192
而不进行转换,您可以使用 FileOutputStream
instead of the PrintWriter
and the method write(int b)
:
FileOutputStream writer = new FileOutputStream("PF500.in");
...
writer.write('\u00c0');
如果您想继续使用 PriterWriter
,您必须 指定 encoding/charset打印机使用:PrintWriter(File file, String csn)
.
通过-Dfile.encoding=...
指定运行Java打印机的charset/encoding(可以导致其他地方出现编码问题)。
作为第四个选项,不推荐,可能有效也可能无效,您可以先进行逆转换:
case "0801": tarifa = new String(new byte[]{(byte)192});
解决方案
好的,过了一段时间我终于找到了问题所在:这里我将 PrintWriter 更改为 Writer,并在以下行中将 FileOutputStream 的编码设置为 "Cp1252":
Writer writer = new BufferedWriter(new OutputStreamWriter(
新的 FileOutputStream("PF500.in"), "Cp1252"));
现在它工作正常。事实证明,由于我仍然未知的原因,该文件是用 utf-8 编码保存的,而财务打印机无法识别所有字符,因此收据有误。将编码更改为"Cp1252"后,该过程运行良好。
我正在制作一个使用财务打印机的应用程序,我发送到打印机的文档必须是西里尔文。问题是一个特定字符(一个用于关税组,因为我正在尝试打印收据)应该是 (char)192
,但不知何故在这个过程中被更改为一些随机字符。我尝试在项目>属性>资源>文本文件编码下将项目的编码更改为 UTF-8,但没有任何改变。我也尝试将 Window>Preferences>General>Workspace>Text file encoding 中的编码更改为 UTF-8,但仍然没有。
注意:当我在其他机器上手动输入文档然后将其发送到财务打印机时它工作正常(但不是在我的电脑上)。我使用记事本编辑文件,输出文件类型为.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 = "";
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)外,一切正常
不用写
tarifa = Character.toString((char)192);
,反正超级费解,直接写你想要的字符:tarifa = "À";
当您打印一个字符串时,它是如何构建的以及您使用什么编码来构建它是完全无关的。 Java 字符串有一个内部字符表示,它独立于您在创建它们时使用的编码或您在从它们获取原始数据时使用的编码。当您创建
PrintWriter
时,您使用了一个使用系统默认编码的构造函数。该编码是这里的症结所在。无论编码是什么,它显然与您的财务打印机不兼容。您应该找出打印机期望的编码,然后使用该编码具体构造您的PrintWriter
:writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream("PF500.in"), "CHARSET_NAME"));
问题:
在
writer = new PrintWriter("PF500.in");
创建了一个PrintWriter
这意味着在
writer.println(line2);
包含子字符串 "À"
(与 "\u00c0"
或 Character.toString((char)192)
相同)的字符串 line2
转换为字节基于默认 charset/encoding(这本身取决于操作系统的语言设置)。
解决方案:
- 要直接写入字节
192
而不进行转换,您可以使用FileOutputStream
instead of thePrintWriter
and the methodwrite(int b)
:
FileOutputStream writer = new FileOutputStream("PF500.in");
...
writer.write('\u00c0');
如果您想继续使用
PriterWriter
,您必须 指定 encoding/charset打印机使用:PrintWriter(File file, String csn)
.通过
-Dfile.encoding=...
指定运行Java打印机的charset/encoding(可以导致其他地方出现编码问题)。作为第四个选项,不推荐,可能有效也可能无效,您可以先进行逆转换:
case "0801": tarifa = new String(new byte[]{(byte)192});
解决方案
好的,过了一段时间我终于找到了问题所在:这里我将 PrintWriter 更改为 Writer,并在以下行中将 FileOutputStream 的编码设置为 "Cp1252":
Writer writer = new BufferedWriter(new OutputStreamWriter( 新的 FileOutputStream("PF500.in"), "Cp1252")); 现在它工作正常。事实证明,由于我仍然未知的原因,该文件是用 utf-8 编码保存的,而财务打印机无法识别所有字符,因此收据有误。将编码更改为"Cp1252"后,该过程运行良好。