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


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

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

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

Если из файла в строку вы не читаете, и строки в дебаггере выглядят нормально, то обратите внимание на класс DocFlavor.
...
Рейтинг: 0 / 0
01.11.2016, 13:07
    #39338783
ilta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекодировка в cp866
Непонимание имеется, да. Спасибо за внимание к моей проблеме.
Код: 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
01.11.2016, 13:22
    #39338808
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекодировка в cp866
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
01.11.2016, 14:20
    #39338923
ilta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекодировка в cp866
Спасибо вам большое! Теперь выгружает все символы корректно.

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



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

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

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


Нууу... так я отправляю текст на печать. *краснеющий смайлик*
...
Рейтинг: 0 / 0
01.11.2016, 15:38
    #39339047
ilta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекодировка в cp866
Переписала печать на 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
01.11.2016, 17:00
    #39339163
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекодировка в cp866
ilta,

Оставлю ссылку на важный урок. Вдруг кому пригодится.
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
...
Рейтинг: 0 / 0
01.11.2016, 17:33
    #39339199
ilta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекодировка в cp866
Blazkowicz, спасибо вам большое!
...
Рейтинг: 0 / 0
02.11.2016, 10:52
    #39339657
alexanderer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекодировка в cp866
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
02.11.2016, 11:00
    #39339665
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекодировка в cp866
alexandererМне вот интересно, при каких условиях и в try и в finally в этом примере может быть выкинуто исключение?
А что тут не понятного?
- Создали читателя из файла - система сказала, что файл существует, всё ОК.
- Попробовали прочитать. Система "открыла" файл. Чтение обломались из-за ошибки системы или железою
- Java метод выкинул исключение - выполнение перешло в блок finally
- Вызов метода close делегирует системе просьбу "закрыть" файл. Система опять обламывается ( например, диск более недоступен). Java создаёт и выкидывае новое исключение. Предыдущее "подавлено".
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Перекодировка в cp866 / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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