-1

我正在制作一个使用财务打印机的应用程序,并且我发送到打印机的文档必须是西里尔文。问题是一个特定字符(一个用于关税组,因为我正在尝试打印收据)应该是(char)192,但在此过程中不知何故被更改为一些随机字符。我尝试在 Project>Properties>Resource>Text file encoding 下将项目的编码更改为 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 = "$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)外,一切正常

4

3 回答 3

1

问题:

writer = new PrintWriter("PF500.in");

一个PrintWriter被创建

它将使用此 Java 虚拟机实例的默认字符集对字符进行编码。

这意味着在

writer.println(line2);

line2包含子字符串的字符串"À"(与"\u00c0"or相同)根据默认字符集/编码(其本身取决于操作系统的语言设置Character.toString((char)192))转换为字节。

解决方案:

FileOutputStream writer = new FileOutputStream("PF500.in");
...
writer.write('\u00c0');  
  • 如果要继续使用,PriterWriter则必须指定打印机使用的编码/字符集PrintWriter(File file, String csn)

  • 在运行 Java via 时指定打印机的字符集/编码-Dfile.encoding=...(这可能会导致其他地方出现编码问题)。

  • 作为不推荐的第四个选项,它可能有效也可能无效,您可以先进行逆转换:

case "0801": tarifa = new String(new byte[]{(byte)192});
于 2018-08-31T15:50:55.723 回答
0
  1. 而不是tarifa = Character.toString((char)192);write ,这无论如何都是超级混淆的,只需直接写你想要的字符:tarifa = "À";

  2. 当你打印一个字符串时,它是如何构造的以及你用来构造它的编码是完全无关的。Java 字符串有一个内部字符表示,它独立于创建它们时使用的编码或从它们获取原始数据时使用的编码。当你创建你的PrintWriter时,你使用一个使用系统默认编码的构造函数。该编码是这里的症结所在。无论该编码是什么,它显然与您的财务打印机不兼容。您应该找出打印机期望的编码,然后PrintWriter专门使用该编码构建您的:

    writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream("PF500.in"), "CHARSET_NAME"));

于 2018-08-30T19:48:12.310 回答
0

解决方案

好的,所以过了一段时间我终于找到了问题:这里我将 PrintWriter 更改为 Writer,并在以下行中将 FileOutputStream 的编码设置为“Cp1252”:

Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("PF500.in"), "Cp1252")); 现在它工作正常。事实证明,由于我仍然未知的原因,该文件是使用 utf-8 编码保存的,并且财务打印机无法识别所有字符,因此收据有问题。将编码更改为“Cp1252”后,该过程运行良好。

于 2018-09-04T11:18:58.807 回答