powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Перекодировка в cp866
11 сообщений из 11, страница 1 из 1
Перекодировка в cp866
    #39338705
ilta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Есть такая ситация - создается файл для последующей печати его на принтере, которому для печати требуется досовая кодировка. Сразу скажу, что настраивать кодировки на самом принтере возможности нет - на нем работают другие программы, которые должны продолжать работать. Да и дело не в принтере.
Так вот, создается файл. Если в него писать строки в кодировке по умолчанию, то проблем нет(но есть проблема с распечаткой).
Но если добавить такую строку в код:
Код: java
1.
sStr = new String(sStr.getBytes("cp866"),"cp1251")


то вместо буквы "Ш" вопросительный знак. Остальные символы перекодируются нормально.
Подскажите, может кто знает в чем может быть дело?
...
Рейтинг: 0 / 0
Перекодировка в cp866
    #39338718
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iltaПодскажите, может кто знает в чем может быть дело?
В непонимании кодировок и работы с ними.

Решение в лоб -Dfile.encoding=cp866

Правильное решение требует просмотра вашего кода. Либо вы файл читаете в строку без указания кодировки. Либо в настройках PrintJob надо покопаться.
...
Рейтинг: 0 / 0
Перекодировка в cp866
    #39338721
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilta,

Если из файла в строку вы не читаете, и строки в дебаггере выглядят нормально, то обратите внимание на класс DocFlavor.
...
Рейтинг: 0 / 0
Перекодировка в cp866
    #39338783
ilta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Непонимание имеется, да. Спасибо за внимание к моей проблеме.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
    public void printFile(String _sPrintText, int _iCountLines, String _sFilePath, String _sFileName)
    {
        try 
        {
            //String sFullFileName = "";
            _sFileName = _sFileName.replace("\"", "'");
            _sFileName = _sFileName.replace("\\", "");
            _sFileName = _sFileName.replace("/", "");
            File f = new File(_sFilePath + "\\" + _sFileName + ".txt");
            if (f.exists())
            {
                int i = 1;
                boolean bIsNotFindFileNumber = true;
                while (bIsNotFindFileNumber)
                {
                    f = new File(_sFilePath + "\\" + _sFileName + "_" + i + ".txt");
                    if (!f.exists())
                    {
                        //sFullFileName = _sFilePath + "\\" + _sFileName + "_" + i + ".txt";
                        bIsNotFindFileNumber = false;
                    }
                    i = i + 1;
                }
            }
            else
            {
                //sFullFileName = _sFilePath + "\\" + _sFileName + ".txt";
            }
            String sStr = clS.sNewPage + _sPrintText;
            System.out.println(sStr);
            sStr = new String(sStr.getBytes("cp866"));
            System.out.println(sStr);
            int len = 0;
            BufferedWriter out =  new BufferedWriter(new FileWriter(f));
            for (int i = 0; i < _iCountLines + 2; i++)
            {
                len = sStr.indexOf(clS.sNewLine);
                if (len > -1)
                {
                    String sTmp = sStr.substring(0, len);
                    sStr = sStr.substring(len + clS.sNewLine.length());
                    out.write(sTmp);
                    out.newLine();
                }
            }
            out.close();
        } 
        catch (Exception ex) 
        {
            System.out.println("ClassUsefulProcAndFunc - printFile - err - > " + ex.getMessage());
        }
    }


_sPrintText - текст, который надо отправить на печать
_iCountLines - количество строк на листе
_sFilePath - путь к файлу
_sFileName - имя файла

Мне кажется, проблема появляется до записи в файл, так как в консоль выводит тот же вопросительный знак.

За -Dfile.encoding=cp866 спасибо, приберегу на безвыходную ситуацию, если решение не найдется. Дело в том, что если отправлять на печать, а не сохранять в файл, то тоже вместо "Ш" вопросительный знак - и эту проблему тоже надо решить.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    public void printLPT(String _sPrintText)
    {
        try 
        {
            String sEncodingString = new String(_sPrintText.getBytes("cp866"),"cp1251");
            FileWriter fw = new FileWriter("LPT1:");

            PrintWriter pw = new PrintWriter(fw);
            pw.print(sEncodingString);
            pw.close();
        } 
        catch (IOException ex) 
        {
            System.out.println("ClassUsefulProcAndFunc - printLPT - err - > " + ex.getMessage());
        }
    }
...
Рейтинг: 0 / 0
Перекодировка в cp866
    #39338808
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilta
Код: java
1.
            sStr = new String(sStr.getBytes("cp866"));



Этого в вашем коде быть не должно никогда.

iltaМне кажется, проблема появляется до записи в файл, так как в консоль выводит тот же вопросительный знак.

При чем тут запись в файл?

ilta
Код: java
1.
            FileWriter fw = new FileWriter("LPT1:");


Ну, вот и нашелся источник болезни. Иногда полезно читать документацию
RTFMThe constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable

Используйте
Код: java
1.
new OutputStreamWriter(new FileOutputStream(...), "cp866")


А ваши new String(sStr.getBytes()) - уберите. И так код не фонтан, а с этими костылями совсем не годится.
...
Рейтинг: 0 / 0
Перекодировка в cp866
    #39338923
ilta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо вам большое! Теперь выгружает все символы корректно.

Blazkowiczilta
Код: java
1.
            sStr = new String(sStr.getBytes("cp866"));



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

BlazkowiczПри чем тут запись в файл?

ilta
Код: java
1.
            FileWriter fw = new FileWriter("LPT1:");


Нууу... так я отправляю текст на печать. *краснеющий смайлик*
...
Рейтинг: 0 / 0
Перекодировка в cp866
    #39339047
ilta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переписала печать на lpt, вдруг кому пригодится.
Код: java
1.
2.
3.
4.
5.
            FileOutputStream os = new FileOutputStream("LPT1");
            PrintStream ps = new PrintStream(os, true, "cp866");
            ps.println(_sPrintText);
            ps.print(clS.sNewPage);
            ps.close();



sNewPage = "\f"
...
Рейтинг: 0 / 0
Перекодировка в cp866
    #39339163
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilta,

Оставлю ссылку на важный урок. Вдруг кому пригодится.
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
...
Рейтинг: 0 / 0
Перекодировка в cp866
    #39339199
ilta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, спасибо вам большое!
...
Рейтинг: 0 / 0
Перекодировка в cp866
    #39339657
alexanderer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczilta,

Оставлю ссылку на важный урок. Вдруг кому пригодится.
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

Из урока
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Prior to Java SE 7, you can use a finally block to ensure that a resource is closed regardless of whether the try statement completes normally or abruptly. 
The following example uses a finally block instead of a try-with-resources statement:

static String readFirstLineFromFileWithFinallyBlock(String path)
                                                     throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(path));
    try {
        return br.readLine();
    } finally {
        if (br != null) br.close();
    }
}
However, in this example, if the methods readLine and close both throw exceptions, then the method readFirstLineFromFileWithFinallyBlock
 throws the exception thrown from the finally block; the exception thrown from the try block is suppressed


Мне вот интересно, при каких условиях и в try и в finally в этом примере может быть выкинуто исключение?
...
Рейтинг: 0 / 0
Перекодировка в cp866
    #39339665
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexandererМне вот интересно, при каких условиях и в try и в finally в этом примере может быть выкинуто исключение?
А что тут не понятного?
- Создали читателя из файла - система сказала, что файл существует, всё ОК.
- Попробовали прочитать. Система "открыла" файл. Чтение обломались из-за ошибки системы или железою
- Java метод выкинул исключение - выполнение перешло в блок finally
- Вызов метода close делегирует системе просьбу "закрыть" файл. Система опять обламывается ( например, диск более недоступен). Java создаёт и выкидывае новое исключение. Предыдущее "подавлено".
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Перекодировка в cp866
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]