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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с кодировкой при чтении DBF файла 
V
    Опции темы
maller
Дата 29.8.2007, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 28.8.2007

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



В программе я считываю записи из DBF. При выводе данных в текстовой файл у меня вместо русских букв знаки вопроса. В DBF файле кодировка русских символов вроде Cp866... Подскажите как перекодировать нормально при чтении из dbf?

 
Код

import java.io.*;
import com.linuxense.javadbf.*;

public class Dread {

  public static void main( String args[]) {

    try {

      // create a DBFReader object
      //
      InputStream inputStream  = new FileInputStream("BNKSEEK.DBF"); // take dbf file as program argument
      DBFReader reader = new DBFReader(inputStream); 
      
      FileWriter fileStream = new FileWriter("test.txt");
      PrintWriter output = new PrintWriter(fileStream);

      

      //  reading the rows
      //
      
      
      Object []rowObjects;

      while( (rowObjects = reader.nextRecord()) != null) 
      {

            for( int i=8; i < 9/*rowObjects.length*/; i++) 
            {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    
              
              
              String temp;
              temp =  rowObjects[i].toString();    
                                          
                        
              output.println(rowObjects[i]);                     // <----------- собственно сюда уже выводятся знаки ? вместо русских символов
              
              System.out.println( rowObjects[i]);
              System.out.println("Object =" + temp);
    
            }
      }
      
      output.close();
      inputStream.close();
    }
    catch( DBFException e) 
    {

      System.out.println( e.getMessage());
    }
    catch( IOException e) 
{

      System.out.println( e.getMessage());
    }
  }  
}  



PM MAIL   Вверх
tux
Дата 29.8.2007, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Код

DBFReader reader = new DBFReader(inputStream);
reader.setCharactersetName("Cp866");

PM MAIL Skype GTalk Jabber YIM   Вверх
maller
Дата 30.8.2007, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 28.8.2007

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



Вроде почти получается. Только никак не могу разобраться как мне строку полученную в кодировке cp866 перекодировать в cp1251...
Подскажите пожалуйста?))
PM MAIL   Вверх
tux
Дата 30.8.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(maller @  30.8.2007,  09:50 Найти цитируемый пост)
Вроде почти получается. Только никак не могу разобраться как мне строку полученную в кодировке cp866 перекодировать в cp1251...
Подскажите пожалуйста?)) 

Ты ее уже должен получить в UNICODE, не надо ничего перекодировать. Если ты вразумительного текста там не видишь, значит кодировка DBF не CP866, а windows-1251, например.
PM MAIL Skype GTalk Jabber YIM   Вверх
maller
Дата 30.8.2007, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 28.8.2007

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



На самом деле ситуация такая :

Код

import java.io.*;
import com.linuxense.javadbf.*;

public class Dread {

  public static void main( String args[]) {

    try {

      // create a DBFReader object
      //
      InputStream inputStream  = new FileInputStream("BNKSEEK.DBF"); // take dbf file as program argument
      DBFReader reader = new DBFReader(inputStream); 
      reader.setCharactersetName("Cp866");
      
      FileWriter fileStream = new FileWriter("test.txt");
      PrintWriter output = new PrintWriter(fileStream);

      // get the field count if you want for some reasons like the following
      //
      int numberOfFields = reader.getFieldCount();
      
      System.out.println("numberOfFields = "+numberOfFields);

      // use this count to fetch all field information
      // if required
      //
      for( int i=0; i<numberOfFields; i++) 
      {

            DBFField field = reader.getField( i);

            System.out.println("Field type = "+field.getDataType());
        
            if(i == 5)
                System.out.println("Decimal count = "+field.getDecimalCount());
        
        // do something with it if you want
        // refer the JavaDoc API reference for more details
        //
            System.out.println( field.getName());
      }

      // Now, lets us start reading the rows
      //
      Object []rowObjects;

      while( (rowObjects = reader.nextRecord()) != null) 
      {

            for( int i=8; i < 9/*rowObjects.length*/; i++) 
            {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();

                
                    
                    
                        
              
              
              String temp,temp1;
              temp =  rowObjects[i].toString();
                
    //            byte[] winData = temp.getBytes("Cp1251");
                                          
                        
              output.println(rowObjects[i]);
              
              System.out.println( rowObjects[i]);
              System.out.println("Object =" + temp);
    
            }
      }

      // By now, we have itereated through all of the rows
      
      inputStream.close();
    }
    catch( DBFException e) 
    {

      System.out.println( e.getMessage());
    }
    catch( IOException e) 
{

      System.out.println( e.getMessage());
    }
  }  
}  


у меня на компе выводит в файл знаки вопроса, у соседа выводит в файл в кодировке cp866 -> короче можно прочитать

если я делаю   ->     reader.setCharactersetName("Cp1251");

то у меня выводятся только часть русских букв, остальные вопросы... А у соседа все буквы нормально кроме Ш. 

Что может быть не так у меня на компе?

И второй вопрос как все-таки записать строку в файл в кодировке cp1251?



PM MAIL   Вверх
tux
Дата 30.8.2007, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(maller @  30.8.2007,  10:09 Найти цитируемый пост)
И второй вопрос как все-таки записать строку в файл в кодировке cp1251?

Используй класс java.io.OutputStreamWriter, в его конструкторе можно задать кодировку.

Почему происходят остальные чудеса, не знаю.
PM MAIL Skype GTalk Jabber YIM   Вверх
maller
Дата 30.8.2007, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 28.8.2007

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



Спасибо.
Я решил эту проблему так:

Код

OutputStream os = new FileOutputStream("file.txt");
.......................
.......................
.......................

os.write( string.getBytes("Cp1251") );

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


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 5.4.2006

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



Цитата
то у меня выводятся только часть русских букв, остальные вопросы... А у соседа все буквы нормально кроме Ш. 
А сосед не через микрософтовский ODBC драйвер подключается?
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




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


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

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