Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Приколист
0 / 0 / 0
Регистрация: 18.01.2014
Сообщений: 10
1

Что делать с кодировкой?

20.01.2014, 17:06. Просмотров 820. Ответов 5
Метки нет (Все метки)

Здравствуйте! Есть перенаправление вывода с консоли в фрейм
Java
1
2
3
4
5
6
7
PrintStream out = new PrintStream(new OutputStream() {
                @Override
                public void write(int b) throws IOException {
                    textArea.append(String.valueOf((char) b));
                }
            }); 
            System.setOut(out);
Однако вследствие этого русский текст выводится "кракозябрами". Что можно придумать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2014, 17:06
Ответы с готовыми решениями:

Listiterator что делать?
есть метод в котором есть строки: ListIterator<String> data =...

Что делать с данной ошибкой
Выдает ошибку компилятор! Я новичок, поэтому не могу сам её решить, хотя...

не проходит компиляция, что делать?
Доброго времени суток. У меня возникла проблема. Я начал учить Java по книжке...

Что делать с Optional в слое сервисов?
Dao слой возвращает Optional. В сервисе лучше также возвращать Optional и...

Что дальше делать...
Приветствую всех, я только начал изучать Яву я Новичек, после написания скрипта...

5
darknim
182 / 158 / 48
Регистрация: 30.07.2013
Сообщений: 506
20.01.2014, 18:07 2
Либо использовать этот конструктор: PrintStream(OutputStream out, boolean autoFlush, String encoding) Где можно указать кодировку.

Либо использовать OutputStreamWriter.
1
Приколист
0 / 0 / 0
Регистрация: 18.01.2014
Сообщений: 10
20.01.2014, 18:24  [ТС] 3
Первый вариант пробовал (переставил все, что знал кодировки - кракозяблы).
А второй как использовать?
0
darknim
182 / 158 / 48
Регистрация: 30.07.2013
Сообщений: 506
20.01.2014, 18:38 4
Пониже полистай, там есть хороший пример. ссылка

Добавлено через 4 минуты
Ох я попутал. Там тебе не в файл ведь писать надо.
0
Skipy
1996 / 1419 / 91
Регистрация: 25.11.2010
Сообщений: 3,611
21.01.2014, 11:10 5
Цитата Сообщение от Приколист Посмотреть сообщение
Здравствуйте! Есть перенаправление вывода с консоли в фрейм
Java
1
2
3
4
5
6
7
PrintStream out = new PrintStream(new OutputStream() {
                @Override
                public void write(int b) throws IOException {
                    textArea.append(String.valueOf((char) b));
                }
            }); 
            System.setOut(out);
Однако вследствие этого русский текст выводится "кракозябрами". Что можно придумать?
Ну, во-первых, нужно почитать теорию. .

Во-вторых, после прочтения теории понимаем, что код неправильный от и до. int, который передается в write, это на самом деле byte. У него значимые только нижние 8 бит. И приведение его к char, который вообще-то представляет собой символ в кодировке UTF-16BE, будет работать только для первых 256 символов кодировки. Русского в этих символах нет.

Потому надо сделать следующее:

1. Зафиксировать кодировку PrintStream. Вы сейчас не знаете достоверно, какая там используется кодировка при конвертации символов в байты и, соответственно, какие байты Вы получаете в write. Чтобы не было проблем с разными символами, рекомендуется использовать кодировки, включающие полный unicode. UTF-16 в принципе можно, но с суррогатными областями придется разбираться самостоятельно. Потому я бы рекомендовал UTF-8.

2. Учесть переменное количество байтов на символ в UTF-8. Т.е. преобразовывать в символ надо только после получения всех байтов. Флажком может служить вызов flush (если посмотреть исходники PrintStream, то видно, что flush на низлежащем потоке вызывается только после записи полного буфера байтов или же получения \n, т.е. посередине символа он не вызовется). autoFlush для этого надо выставить в true в конструкторе.

Итого получаем приблизительно такую реализацию:

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
53
54
55
56
57
58
59
60
61
62
63
package ru.skipy.tests;
 
import javax.swing.*;
import java.awt.*;
import java.io.*;
 
/**
 * TextAreaSTDOUTTest
 *
 * @author Eugene Matyushkin aka Skipy
 * @since 20.01.14
 */
public class TextAreaSTDOUTTest extends JFrame {
 
    public static final String STDOUT_ENCODING = "UTF-8";
 
    private JTextArea ta;
    private PrintStream ps;
 
    public TextAreaSTDOUTTest() throws IOException {
        super("Text area STDOUT test");
        ta = new JTextArea();
        add(new JScrollPane(ta), BorderLayout.CENTER);
        setSize(500, 400);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        try {
            ps = new PrintStream(new OutputStream() {
                private ByteArrayOutputStream baos = new ByteArrayOutputStream();
 
                @Override
                public void write(int b) throws IOException {
                    baos.write(b);
                }
 
                @Override
                public void flush() throws IOException {
                    baos.flush();
                    baos.close();
                    ta.append(new String(baos.toByteArray(), STDOUT_ENCODING));
                    baos.reset();
                }
            }, true, STDOUT_ENCODING);
        } catch (UnsupportedEncodingException ex) {
            // shouldn't happen if UTF-8 is used
            ex.printStackTrace();
        }
    }
 
    public PrintStream getOut() {
        return ps;
    }
 
    public static void main(String[] args) throws IOException {
        TextAreaSTDOUTTest t = new TextAreaSTDOUTTest();
        if (t.getOut() != null) {
            System.setOut(t.getOut());
        }
        t.setVisible(true);
        System.out.println("English text");
        System.out.println("Русский текст");
    }
}
2
Приколист
0 / 0 / 0
Регистрация: 18.01.2014
Сообщений: 10
21.01.2014, 13:23  [ТС] 6
Большое спасибо. Еще раз убеждаюсь - без знания теории как-то грустно
0
21.01.2014, 13:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2014, 13:23

Отправка письма: SendFailedException: что делать?
Пытаюсь отправить письмо и получаю следующее: ...

Движок. Что такое и как делать?
Объясните неграмотному человеку: что такое движок? Я имею ввиду вообще любой...

Ошибка в коде потока. Что делать?
class MyThread extends Thread { @Override public void run()...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru