1. Акция на весь декабрь! Получай оплату х2 за уникальные статьи, объемом от 200 слов, если в заголовке темы и теле статьи присутствует слово Python
    Скрыть объявление

Bytearrayinputstream

Тема в разделе "Java", создана пользователем Serduko, 15 мар 2013.

  1. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    При 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();
    }

    }
     
  2. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    Что вы вообще пытаетесь сделать и почему считаете, что это должно сработать?

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

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Да, все делается в Eclipse, в настройках стоит по умолчанию "windows-1251" (как в общих так и в настройках класса), переменная ENCODING была добавлена на всякий случай.
     
  4. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    с вопросом про кодировку исходников был не прав, она тут не имеет значения.
    а вот со вторым вопросом угадал
    в яве char кодирует символы в utf-16, где кирилица занимает 0x0400–0x04FF позиции
    в 1251 кодировке кирилица занимает 0xC0-0xFF
    т.е. в данном случае простое преобразование прочитаного из ByteArrayInputStream байта к char не подходит.
     
  5. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Поборол. (на чистоту кода не обращайте внимания, код исключительно для тестирования)
    Код (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();
    }

    }
     
  6. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Причем, работает и такой вариант:
    Код (C++):
    ps = new PrintStream(System.out, true)
     

Поделиться этой страницей