• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Bytearrayinputstream

  • Автор темы Serduko
  • Дата начала
S

Serduko

При ByteArrayInputStream не желает выводить русский текст, т.е. выводит: "??????? ?????", подскажите пожалуйста, как побороть?

C++:
import java.io.*;

class BufferedInputStreamDemo {

private final static String ENCODING = "windows-1251";

public static void main(String[] args) {
PrintWriter pw = new PrintWriter(System.out, true);

String s = "Русский текст";
byte buf[] = null;
try{
buf = s.getBytes(ENCODING);
}catch( UnsupportedEncodingException e){
pw.println("Unsupported character set");
}

ByteArrayInputStream in = new ByteArrayInputStream(buf);
BufferedInputStream f = new BufferedInputStream(in);
int c;
boolean marked = false;

try{
while((c=f.read()) != -1){
pw.print((char) c); 	
}
}catch(IOException e){
pw.println("ошибка IOException");
}
pw.println();
}

}
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
Что вы вообще пытаетесь сделать и почему считаете, что это должно сработать?

1. Вы уверены, что кодировка исходников именно windows-1251?
2. Вы уверены, что символы windows-1251 и UTF-16 совпадают на диапазоне 0-255?
 
S

Serduko

Да, все делается в Eclipse, в настройках стоит по умолчанию "windows-1251" (как в общих так и в настройках класса), переменная ENCODING была добавлена на всякий случай.
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
с вопросом про кодировку исходников был не прав, она тут не имеет значения.
а вот со вторым вопросом угадал
в яве char кодирует символы в utf-16, где кирилица занимает 0x0400–0x04FF позиции
в 1251 кодировке кирилица занимает 0xC0-0xFF
т.е. в данном случае простое преобразование прочитаного из ByteArrayInputStream байта к char не подходит.
 
S

Serduko

Поборол. (на чистоту кода не обращайте внимания, код исключительно для тестирования)
C++:
import java.io.*;

class BufferedInputStreamDemo {

private final static String ENCODING = "windows-1251";

public static void main(String[] args) {
PrintWriter pw = new PrintWriter(System.out, true);
PrintStream ps;

try{
ps = new PrintStream(System.out, true, "UTF-16");
}catch(UnsupportedEncodingException e){
pw.println("UnsupportedEncodingException");
return;
}

String s = "Русский текст";
byte buf[] = null;
try{
buf = s.getBytes(ENCODING);
}catch( UnsupportedEncodingException e){
pw.println("Unsupported character set");
}

ByteArrayInputStream in = new ByteArrayInputStream(buf);
BufferedInputStream f = new BufferedInputStream(in);
int c;

try{
while((c=f.read()) != -1){
ps.write((char) c);
}
}catch(IOException e){
pw.println("ошибка IOException");
}
pw.println();
}

}
 
S

Serduko

Причем, работает и такой вариант:
C++:
ps = new PrintStream(System.out, true)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!