Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> чтение строки из файла, проблеммы с кодировкой 
V
    Опции темы
GavriKos
Дата 13.7.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



Доброго времени суток всем! Стоит задача - прочитать строку из фала (строка заканчивается 13 символом) и вывести ее на экран (вывести через канвас). Сделал чтение строки таким вот образом:

Код

    public String readStringFormFile(DataInputStream data)
    {
        char readBuf=0;
        int count=0;
        char buf[] = new char[255];
        String s = new String();
        try
        {
            readBuf = (char)data.read();
            while ((readBuf!=13)&&(count<255))
            {
                buf[count]=readBuf;
                count++;
                readBuf = (char)data.read();
            }
            
        }
        catch (IOException io) {System.out.println("error");}
        s = new String(buf);
        return s;
    }


На экран выводится вместо строк толпа кракозябриков. Полазил по форуму, нашел много вариантов, но ни один не помог. Пробовал вручную менять символы на юникодовские (switch-case), не помогло. Через s.getBytes("utf") тоже ничего не получилось. Нашел один метод в книге буткевичА, там автор тоже заменяет символы на юникодовские, причем не через свич, а поиском подстроки в строке, но вот только стока юникодовских символов кажется некорректная - нормально переводит только большие буквы.

Подскажите как быть? Может что то изменить в функции чтения? 

IDE - NetBeans 6. Текст в файл вписывал в самой IDE (файл идет ресурсом, естественно).
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
Platon
Дата 13.7.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: нет
Всего: 40



data.read() читает байт. А тебе надо читать символ в какой-то кодировке. попробуй 

Код

InputStreamReader reader = new InputStreamReader(data);
char[] buff = new char[13];
int offset = 0;
int am;
while (offset < buff.length && (am = reader.read(buff, offset, buff.length - offset)))
    offset += am;
if (offset != buff.length)
    throw new IllegalStateException();
System.out.println(String.valueOf(buff));


Добавлено через 4 минуты и 16 секунд
Опять спутал раздел :( этот кусок кода актуален для SE, для ME даже не знаю.
PM MAIL ICQ   Вверх
eugine_s
Дата 13.7.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17



Код

    private String getText(String path) {
        DataInputStream dis = new DataInputStream(getClass().getResourceAsStream(path));
        StringBuffer strBuff = new StringBuffer();
        int ch = 0;
        try {
            try {
                while ((ch = dis.read()) != -1) {
                    strBuff.append((char) ((ch >= 0xc0 && ch <= 0xFF) ? (ch + 0x350) : ch));
                }
            } finally {
                dis.close();
            }
        } catch (Exception e) {
            System.err.println("ERROR");
            e.printStackTrace();
        }
        return strBuff.toString();
    }


Попробуй так читать содержимое файла.
Этот метод возвращает строку - содержимое файла. Из этой строки ты сможешь достать нужные тебе подстроки.
*Учитывай, что файл должен быть в кодировке Win-1251.


PM MAIL   Вверх
GavriKos
Дата 13.7.2008, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



2 Platon: Насколько я понял, ты предлогаешь читать не из DataInputStream, а из InputStreamReader? Это не помогло. Проверил выводом System.out.println - тоже выводит кракозябры...

Это сообщение отредактировал(а) GavriKos - 13.7.2008, 16:02
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
Platon
Дата 13.7.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: нет
Всего: 40



GavriKos, а ты выбрал нужную кодировку?
PM MAIL ICQ   Вверх
GavriKos
Дата 13.7.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



eugine_s - спасибо, помогло!  smile Буду разбираться.
Насколько я понял, strBuff.append((char) ((ch >= 0xc0 && ch <= 0xFF) ? (ch + 0x350) : ch)); отвечает за преобразование символа в его юникодовский аналог?

Добавлено через 3 минуты и 29 секунд
Все, разобрался, получилось. ВОт моя функция с поправкой, вдруг кому понадобится:

Код

    public String readStringFormFile(DataInputStream data)
    {
        char readBuf=0;
        int count=0;
        char buf[] = new char[255];
        String s = new String();
        try
        {
            readBuf = (char)data.read();
            while ((readBuf!=13)&&(count<255))
            {
                buf[count]=(char) ((readBuf >= 0xc0 && readBuf <= 0xFF) ? (readBuf + 0x350) : readBuf);
                count++;
                readBuf = (char)data.read();
            }
            
        }
        catch (IOException io) {System.out.println("error");}
        s = new String(buf);
        return s;
    }


Добавлено через 4 минуты и 49 секунд
2 Platon - да ,пробовал с разными кодировками.
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
eugine_s
Дата 13.7.2008, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17



Цитата(GavriKos @  13.7.2008,  16:06 Найти цитируемый пост)
eugine_s - спасибо, помогло!  smile Буду разбираться.
Насколько я понял, strBuff.append((char) ((ch >= 0xc0 && ch <= 0xFF) ? (ch + 0x350) : ch)); отвечает за преобразование символа в его юникодовский аналог?


Да, это преобразование Win -> UTF

Только в этом методе с буквой Ё и ё проблемы, они не вписываются такое правило преобразования символов...
PM MAIL   Вверх
Platon
Дата 13.7.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: нет
Всего: 40



Код

import java.io.*;

public class Test {

    public static void main(String[] args) throws IOException {
        DataInputStream data = new DataInputStream(new FileInputStream("c:/tmp/test.txt"));
        InputStreamReader reader = new InputStreamReader(data, "CP1251");
        
        StringBuilder b = new StringBuilder(32);
        int a;
        while ((a = reader.read()) != -1) {
            if (a == '\r' || a == '\n')
                break;
            b.append((char)a);
        }
        System.out.println(b.toString());
    }
}



Лично проверил >_<
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0793 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.