powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы с кодировкой в java
25 сообщений из 39, страница 1 из 2
Проблемы с кодировкой в java
    #38282931
Insane_1990
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемые!

Бьюсь уже битый день с проблемой кодировки, ничего не помогает....
Может быть, Вы сможете помочь.

Есть база данных Oracle 11gR2. Там таблица, с CLOB.

Выполняется запрос к базе, по извлечению этих данных:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
while ( getkeyResultSet.next() ) {

InputStream simpleValueStream = getkeyResultSet.getBinaryStream(2);//Берем данные из базы в поток байт.
BufferedReader br;
String line;
InputStreamReader isr = new InputStreamReader(simpleValueStream);
br = new BufferedReader(isr);
try {
while ((line = br.readLine()) != null)
{
   System.out.println(line);
   byte[] b  = line.getBytes("windows-1251");
   String line2 =  new String(b,"UTF-8");
   System.out.println(line2);
}
}



К примеру, сообщение выглядит в базе так: Если Наташино здоровье позволяет, хотелось бы чаще видеть ее на моих уроках.
Но на выходе, в System.out.println(line); получаю то же сообщение, с пробелами в тех же местах, но в таком виде:
???? ???????? ???????? ?????????, ???????? ?? ???? ?????? ?? ?? ???? ??????.


Помогите пожалуйста, что я делаю не так, что нужно сделать, что бы был читаемый результат на выходе? Очень надо, срочно((((

Charset.defaultCharset() = UTF-8.
Кодировка в базе - UTF-8.
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38282933
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Insane_1990,
Код: java
1.
byte[] b  = line.getBytes("windows-1251");


Что это?
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38282935
Insane_1990
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
just_vladimir,

взял отсюда:
http://www.javaportal.ru/java/articles/javaandunicode.html

Преобразование между строками и потоком байт
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38282938
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Insane_1990,
1. По указанной ссылке ничего подобного нет.
2. В выделенной строчке не "преобразование между строками и потоком байт".
3. Где Вы нашли такую кодировку "windows-1251" ?
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38282942
Insane_1990
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
just_vladimir,

1), 2) Хорошо, как предлагаете решить эту проблему Вы?
3) Осталось от старого кода, даже если использовать другие, типа "UTF-8" или "Cp1251", все-равно ничего.
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38282955
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас поле CLOB, что уже подразумевает текстовые данные. И вместо того чтобы использовать методы работы с данными вы

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
//Читаете текст в двоичные данные. Не зная в какой кодировке вам сервер их отдал.
getkeyResultSet.getBinaryStream(2);
//Преобразуете ваши байты обратно в текст, используюя текущую дефолтную 
//кодировку Java (она совсем не обязательно совпадает с той, которую использует БД) 
InputStreamReader isr = new InputStreamReader(simpleValueStream);
//Сломав текст предыдущими операциями пытаетесь его восстановить
byte[] b  = line.getBytes("windows-1251");
String line2 =  new String(b,"UTF-8");



Во-первых, проблему надо решать, там где ломается кодировка, а не дополнительным перекодированием.
Во-вторых этот способ перекодирования не гарантирует результат. В некоторых случаях возможны потери некоторых символов.

Пример чтения CLOB из официального туториала
http://docs.oracle.com/javase/tutorial/jdbc/basics/blob.html#retrieve_clob
Официальная документация. Метод, которым сразу можно получить Reader без InputStream
http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html#getCharacterStream(int)
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38282959
Insane_1990
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

дело в том, что в дальнейшем мне нужен именно InputStream, для записи в NoSQL базу данных. (метод PutLob требует значение в виде Потока). Стандартные методы я реализовал, но по сравнению с BinaryStream они работаю много медленнее. А хотелось бы не терять производительность.
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38282961
Insane_1990
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Insane_1990,
плюс кодировка базы и java - совпадает, везде UTF-8
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38282972
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Insane_1990дело в том, что в дальнейшем мне нужен именно InputStream, для записи в NoSQL базу данных. (метод PutLob требует значение в виде Потока).

Лучше поискать вариант с хранением текста. Хотя..

Insane_1990Стандартные методы я реализовал, но по сравнению с BinaryStream они работаю много медленнее.
А хотелось бы не терять производительность.
В принципе, логично. Просто скопировать байты будет намного быстрее. Но я вам объясняю почему ваш код не работает,
это к вопросу копирования отношения не имеет. Обратите внимание, что чтение CLOB не единственная проблема в приведенном выше коде.
То есть у вас есть InputStream, его надо использовать в методе pubLob, то к чему тогда все эти вопросы с выводом\перекодировкой?

Запустите с -Dfile.encoding=UTF-8
Либо так
new InputStreamReader(simpleValueStream, "UTF-8");
строки с перекодировкой выкинуть
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38282973
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Insane_1990Insane_1990,
плюс кодировка базы и java - совпадает, везде UTF-8
Угу. Тогда бы вопросов не возникало. Покажите текст, который выводиться до того как вы перекодировку применяете.
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38282975
Insane_1990
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

по поводу кодировки я писал в самом первом сообщении =)
Charset.defaultCharset() = UTF-8.
Кодировка в базе - UTF-8.

Blazkowicz То есть у вас есть InputStream, его надо использовать в методе pubLob, то к чему тогда все эти вопросы с выводом\перекодировкой?

Вопросы потому, что в дальнейшем я хочу посмотреть записанные данные из NoSQL хранилища. и когда я прошу его по ключу показать значение, то вводит он полную лабуду, а конкретно знаки вопросов=)

Не CLOb и BLOB парсятся и копируются немного по другому, с другими типами все ок. Даже с BLOB нет проблем. Проблемы именно с CLOB.

По поводу текста перед перекодировки - я уже писал, опять таки в первом сообщении. В базе он выглядит так:
Если Наташино здоровье позволяет, хотелось бы чаще видеть ее на моих уроках.

Дальше сразу идет поток байт, поэтому по всей видимости баг где то тут....
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38282989
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Insane_1990По поводу текста перед перекодировки - я уже писал, опять таки в первом сообщении. В базе он выглядит так:
Если Наташино здоровье позволяет, хотелось бы чаще видеть ее на моих уроках.

Дальше сразу идет поток байт, поэтому по всей видимости баг где то тут....
Если первый System.out.println(line) уже выводит вопросительные знаки, то текст безвозвратно утерян. Дальнейшие манипуляции - мертвому припарка.
Давайте тогда так. Сделайте текст из одной-двух русских букв.
И покажие в hex все байты вычитаные из getkeyResultSet.getBinaryStream()
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38283002
Insane_1990
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Смотрите, уже на моменте
InputStream simpleValueStream = getkeyResultSet.getBinaryStream(2);

при дебаге все очень странно выглядит. Сообщение, которое я приводил ниже, в simpleValueStream хранится вот так:
[63,63,63,63,32,63,63,63,63,63,63,63,63,32,...]

И так в основном все остальные...в основном встречается число 63...в HEX : 3F 3F 3 F3 F20 3F и т.д..Это все с тем сообщением. К сожалению туда не могу сейчас ввести данные, сейчас на локальной введу, и скажу как поведет себя локальная база.
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38283069
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Insane_1990,
http://docs.oracle.com/cd/F49540_01/DOC/java.815/a64685/basic4.htm
тогда нужно ковырять настройки оракла и драйвера, в Java коде уже поздно что-то делать если увас уже текст потерян.
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38283086
Insane_1990
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

думаете проблема в базе? Это странно, потому что кодировка одинаковая...
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38283088
Insane_1990
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

и кстати, если делать не BinaryStream, а просто getString, то все окей...
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38283133
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Insane_1990Blazkowicz,

думаете проблема в базе? Это странно, потому что кодировка одинаковая...
Скорее в драйвере, но возможно она вызвана проблемами в базе.
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38283308
Insane_1990
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

а может быть проблема в типе подключения ? Имеется ввиду драйвер подключения - thin или oci? у меня стоит thin. пробовал oci - ругается на несовместимость платформ
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38283349
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Insane_1990,
а что возвращается при использовании getCharacterStream? Только исходное значение, до всяческих приседаний с кодировками.
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38283366
Insane_1990
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
just_vladimir,

при использовании getCharacterStream возвращается следующее:
Reader r = getkeyResultSet.getCharacterStream(2);

[Е,с,л,и, ,н,а,т,а,ш,и,н,о, ,з,д,о,р,о,в,ь,е, ,п,о,з,в,о,л,я,е,т,,, ,х,о,т,е,л,о,с,ь, ,б,ы, ,ч,а,щ,е, ,в,и,д,е,т,ь, ,е,е, ,н,а, ,м,о,и,х, ,у,р,о,к,а,х,.]
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38283372
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Insane_1990а может быть проблема в типе подключения ? Имеется ввиду драйвер подключения - thin или oci? у меня стоит thin. пробовал oci - ругается на несовместимость платформ
Были бы исходники, можно было бы подебажить, посмотреть как драйвер текст в двоичные данные переводит. Но Оракл, кажется, их не предоставляет.
Вообще странно. 3F это уже вопросительные знаки. Совершенно не понятно почему getBinaryStream сразу их возвращает.
Единственный вариант, если он пытается текст привести к ASCII или другому 8-битному формату и все символы, уже за его пределом.
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38283390
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А покажите NLS_CHARACTERSET и другие переменные.
Сервер точно в UTF-8? Оракл такая хитрожопая фигня, что он может хранить в текущей клиентской кодировке, при этом находясь в WE8ISO8859.
В этом случае он дефолтными методами отдаёт исходный текст более менее нормально, но шаг влево, шаг вправо уже интересности.
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38283409
Insane_1990
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Код: plsql
1.
Select * from nls_database_parameters;



NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET AL32UTF8
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET UTF8
NLS_RDBMS_VERSION 10.2.0.5.0
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38283423
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Insane_1990,
а чем getCharacterStream не подходит? В самый край можно и deprecated метод getUnicodeStream, если нужен именно InputStream.
А так по идее CharacterStream для CLOB, BinaryStream для BLOB и все замечательно.
...
Рейтинг: 0 / 0
Проблемы с кодировкой в java
    #38283425
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может конвертнуть как-то на уровне запроса?
http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_lob.htm#i1020355
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы с кодировкой в java
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]