Как перенаправить весь вывод консоли на Swing JTextArea / JTextPane с правильной кодировкой?
Я пытался перенаправить систему.из PrintStream в JTextPane. Это отлично работает, за исключением кодирования специальных символов локали. Я нашел много документации об этом (см. например. страница кодирования mindprod), но я все еще борюсь с ним. Аналогичные вопросы были опубликованы в StackOverFlow, но кодировка не была рассмотрена, насколько я видел.
первый вариант:
String sUtf = new String(s.getBytes("cp1252"),"UTF-8");
второе решение должно использовать java.НИО. Я не понимаю как использовать кодировку.
Charset defaultCharset = Charset.defaultCharset() ;
byte[] b = s.getBytes();
Charset cs = Charset.forName("UTF-8");
ByteBuffer bb = ByteBuffer.wrap( b );
CharBuffer cb = cs.decode( bb );
String stringUtf = cb.toString();
myTextPane.text = stringUtf
ни одно решение не работает. Есть идеи?
спасибо заранее, к сайту jgran
4 ответов
попробуйте этот код:
public class MyOutputStream extends OutputStream {
private PipedOutputStream out = new PipedOutputStream();
private Reader reader;
public MyOutputStream() throws IOException {
PipedInputStream in = new PipedInputStream(out);
reader = new InputStreamReader(in, "UTF-8");
}
public void write(int i) throws IOException {
out.write(i);
}
public void write(byte[] bytes, int i, int i1) throws IOException {
out.write(bytes, i, i1);
}
public void flush() throws IOException {
if (reader.ready()) {
char[] chars = new char[1024];
int n = reader.read(chars);
// this is your text
String txt = new String(chars, 0, n);
// write to System.err in this example
System.err.print(txt);
}
}
public static void main(String[] args) throws IOException {
PrintStream out = new PrintStream(new MyOutputStream(), true, "UTF-8");
System.setOut(out);
System.out.println("café résumé voilà");
}
}
String в java не имеет кодировки-строки поддерживаются массивом символов, и символ всегда должен быть utf-16, пока они рассматриваются как строки и значения char.
кодировка возникает только при экспорте или импорте строк / символов во внешнее представление (или местоположение) или из него. Передача должна происходить с использованием последовательности байтов для представления строки.
Я думаю, что первое решение близко, но и совершенно запутались. Сначала вы просите java перевести значения char в их эквивалентные значения с кодировкой cp1252 ("слово" для аналогичного символа в языке cp1252). Затем вы создаете строку из этой последовательности байтов, заявляя, что эта последовательность кодов cp-1252 на самом деле является последовательностью кодов utf-8 и должна быть переведена на стандартное представление в памяти (utf-16) из utf-8.
строка никогда не является utf OG cp1252 или чем - то подобным-это символы alsways. Только байт последовательности utf-8 или cp1252. Если вы хотите перевести значения char в строку utf-8, вы можете использовать.
byte[] utfs = myString.getBytes("UTF-8");
на самом деле, я думаю, что проблема лежит в другом месте, вероятно, внутри printstream и как он печатает свой ввод. Вы должны стараться избегать преобразования строк и символов в/из байтов, потому что это всегда является основным источником путаницы и проблем. Возможно, необходимо переопределить все методы для захвата символьных данных перед преобразованием.
Как вы справедливо предполагаете, проблема, скорее всего, в:
String s = Character.toString((char)i);
поскольку вы кодируете UTF-8, символы могут быть закодированы с более чем 1 байтом и, таким образом, добавление каждого байта, который Вы читаете как символ, не будет работать.
чтобы заставить его работать, вы можете попробовать записать все байты в ByteBuffer и использовать CharsetDecoder (Charset.forName ("UTF-8).newDecoder ()," UTF-8", чтобы соответствовать PrintStream), чтобы преобразовать их в символы, которые вы добавляете панель.
Я не попробовал, чтобы убедиться, что он работает, но я думаю, что стоит попробовать.
вы должны создать PrintStream с правильным кодированием: http://www.j2ee.me/j2se/1.5.0/docs/api/java/io/PrintStream.html#PrintStream(java.io.File, java.ленг.String)
не могли бы вы предоставить больше кода о том, что ты пытаешься сделать?