1 Востаннє редагувалося colin200x (22.09.2023 14:10:41)

Тема: Кодування в форматі DBF і DAT

Доброго дня всім.
В мене файлики банківської виписка в форматі DBF і DAT. коли вивожу їх зміст в консоль, пише крякозяблики, те саме показує в jtextarea.(слово "сума" написано кирилецею в коді)
Для читання використовую о це: com.linuxense.javadbf.DBFReader(може проблема в ньому). Кодування обох файлів UTF-8, так показує метод isr.getEncoding()

сума: 4.000000000| desc: ÒÎÂÀÐÈÑÒÂÎ Ç ÎÁÌÅÆÅÍÎÞ | ÒÎÂÀÐÈÑÒÂÎ Г

Коли ж я відкриваю цей файл в writer запитує кодування, ставлю windows 1251 і все чудово показує.
ось такий код:

try {
    String dbfPath = "2309201.dbf";
    InputStream inputStream = new FileInputStream(dbfPath);
    InputStreamReader isr = new InputStreamReader(inputStream);
    DBFReader reader = new DBFReader(inputStream);
    Object[] rowObjects; BigDecimal price = new BigDecimal(0); String description = "", ansiString = "";
    while ((rowObjects = reader.nextRecord()) != null) {
        price = (BigDecimal) rowObjects[12];
        description = (String) rowObjects[4];
        ansiString = new String(description.getBytes("UTF8"), "Windows-1251");
        System.out.println("сума: "+price+ "| desc: "+description+" | "+ ansiString);
    }
    inputStream.close();
    JFrame f = new JFrame();
    f.setBounds(100, 100, 700, 500);
    JTextArea textArea = new JTextArea();
    textArea.setText("сума: "+ price +"\nопис: "+ description+"\n"+ansiString);
    f.add(textArea);
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} catch (Exception e) {
    e.printStackTrace();
}

2

Re: Кодування в форматі DBF і DAT

colin200x написав:

запитує кодування, ставлю windows 1251 і все чудово показує

Тобто кодування файлу - windows 1251. А ви намагаєтеся його намагаєтеся декодувати з UTF8 у Windows-1251.

colin200x написав:

Кодування обох файлів UTF-8, так показує метод isr.getEncoding()

У файлі немає кодування. У файлі є лише байти. Які можна інтерпретувати, як текст у певному кодуванні. isr.getEncoding() каже, що isr буде це робити в "UTF8", але це помилка. Спробуйте

InputStreamReader isr = new InputStreamReader(inputStream, "Windows-1251"); 

і не перекодовуйте далі.

Подякували: colin200x1

3

Re: Кодування в форматі DBF і DAT

Ось цей рядок:

ansiString = new String(description.getBytes("UTF8"), "Windows-1251");

мене лякає. Щось, що лежить у рядку description, розкодовується за правилами utf-8, після чого закодовується за правилами cp1251. Якщо в description лежить щось крім базової латиниці, то нічого хорошого з цього не вийде.

Спробуйте зробити так:

ansiString = new String(description.getBytes("latin1"), "Windows-1251");

Маєте отримати текст "ТОВАРИСТВО З ОБМЕЖЕНОЮ"

З latin1 це спрацювало, бо воно є найпростішим кодуванням, значення байтів у якому дорівнюють кодам відповідних символів. UTF-8 робить більш складні перетворення.

Подякували: colin200x1

4

Re: Кодування в форматі DBF і DAT

dbf це не текстовий формат, а файл бази даних. Найдіть програму, що його створила, експортувати в текст і потім вже читайте

Подякували: colin200x1

5

Re: Кодування в форматі DBF і DAT

ur_naz написав:

dbf це не текстовий формат, а файл бази даних. Найдіть програму, що його створила, експортувати в текст і потім вже читайте

Ну я його відкриваю як в блокноті, так і в ексель. Використорую jar для dbf файлів.

6

Re: Кодування в форматі DBF і DAT

Пане ur_naz, як гадаєте, що саме робить рядок

DBFReader reader = new DBFReader(inputStream);

у цій програмі?

Подякували: leofun011

7

Re: Кодування в форматі DBF і DAT

І допоміг цей рядок? Я бачу 3 різних кодування в одному рядку

8

Re: Кодування в форматі DBF і DAT

Звісно, допоміг. Якби не він, то були б ще технічні байти з формату DBF.

Подякували: colin200x1

9

Re: Кодування в форматі DBF і DAT

там 3 різні кодування, тому і крокозябли

Подякували: colin200x1