Eclipse печатает неправильный кириллический символ - PullRequest
0 голосов
/ 30 августа 2018

Я создаю приложение, которое использует фискальный принтер, и документ, который я отправляю на принтер, должен быть на кириллице. Проблема в том, что один конкретный символ (один для тарифной группы, потому что я пытаюсь распечатать квитанцию) должен быть (char)192, но каким-то образом в процессе изменяется на некоторый случайный символ. Я попытался изменить кодировку проекта на UTF-8 в Project> Properties> Resource> Кодировка текстового файла, но ничего не изменилось. Я также попытался изменить кодировку в 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)

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Проблема:

В

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

a PrintWriter создано

, который будет кодировать символы , используя для этого кодировку по умолчанию экземпляр виртуальной машины Java.

Это означает, что в

writer.println(line2);

строка line2, содержащая подстроку "À" (которая совпадает с "\u00c0" или Character.toString((char)192)), преобразуется в байты на основе кодировки / кодировки по умолчанию (которая сама зависит на настройке языка операционной системы).

Решения:

  • Чтобы напрямую записать байт 192 без его преобразования , вы можете использовать FileOutputStream вместо PrintWriter и метод write(int b)
FileOutputStream writer = new FileOutputStream("PF500.in");
...
writer.write('\u00c0');  
  • Если вы хотите продолжить использование PriterWriter вместо этого, вы должны указать кодировку / кодировку, которые используются принтером : PrintWriter(File file, String csn) .

  • Укажите кодировку / кодировку принтера при запуске Java через -Dfile.encoding=... (что может привести к проблемам с кодированием в другом месте).

  • В качестве четвертого варианта, который не рекомендуется и может работать или не работать, вы можете сначала выполнить обратное преобразование:

case "0801": tarifa = new String(new byte[]{(byte)192});
0 голосов
/ 04 сентября 2018

РЕШЕНИЕ

Хорошо, так что через некоторое время я наконец нашел проблему: Здесь я изменил PrintWriter с Writer и установил кодировку FileOutputStream в «Cp1252» в следующей строке:

Writer writer = new BufferedWriter (new OutputStreamWriter ( новый FileOutputStream ("PF500.in"), "Cp1252")); Теперь работает нормально. Оказывается, по неизвестным мне причинам, что файл был сохранен с кодировкой utf-8, а фискальный принтер не распознал все символы, отсюда и ошибочные квитанции. После изменения кодировки на «Cp1252» процесс работает хорошо.

0 голосов
/ 30 августа 2018
  1. Вместо того, чтобы писать tarifa = Character.toString((char)192);, что в любом случае просто запутывает, просто напишите нужный вам символ: tarifa = "À";

  2. Когда вы печатаете строку, совершенно неважно, как она была построена и какую кодировку вы использовали для ее создания. Строки Java имеют внутреннее символьное представление, которое не зависит от кодировки, которую вы используете при их создании, или кодировки, которую вы используете при получении необработанных данных из них. Когда вы создаете PrintWriter, вы используете конструктор, который использует кодировку по умолчанию для вашей системы. Эта кодировка суть здесь. Какой бы ни была эта кодировка, она явно несовместима с вашим фискальным принтером. Вы должны выяснить, какую кодировку ожидает принтер, а затем сконструировать PrintWriter именно с этой кодировкой:

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

...