|
|
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Добрый день, уважаемые! Бьюсь уже битый день с проблемой кодировки, ничего не помогает.... Может быть, Вы сможете помочь. Есть база данных Oracle 11gR2. Там таблица, с CLOB. Выполняется запрос к базе, по извлечению этих данных: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. К примеру, сообщение выглядит в базе так: Если Наташино здоровье позволяет, хотелось бы чаще видеть ее на моих уроках. Но на выходе, в System.out.println(line); получаю то же сообщение, с пробелами в тех же местах, но в таком виде: ???? ???????? ???????? ?????????, ???????? ?? ???? ?????? ?? ?? ???? ??????. Помогите пожалуйста, что я делаю не так, что нужно сделать, что бы был читаемый результат на выходе? Очень надо, срочно(((( Charset.defaultCharset() = UTF-8. Кодировка в базе - UTF-8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2013, 19:01:42 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Insane_1990, Код: java 1. Что это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2013, 19:05:15 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
just_vladimir, взял отсюда: http://www.javaportal.ru/java/articles/javaandunicode.html Преобразование между строками и потоком байт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2013, 19:08:05 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Insane_1990, 1. По указанной ссылке ничего подобного нет. 2. В выделенной строчке не "преобразование между строками и потоком байт". 3. Где Вы нашли такую кодировку "windows-1251" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2013, 19:15:34 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
just_vladimir, 1), 2) Хорошо, как предлагаете решить эту проблему Вы? 3) Осталось от старого кода, даже если использовать другие, типа "UTF-8" или "Cp1251", все-равно ничего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2013, 19:22:42 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
У вас поле CLOB, что уже подразумевает текстовые данные. И вместо того чтобы использовать методы работы с данными вы Код: java 1. 2. 3. 4. 5. 6. 7. 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2013, 19:43:06 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, дело в том, что в дальнейшем мне нужен именно InputStream, для записи в NoSQL базу данных. (метод PutLob требует значение в виде Потока). Стандартные методы я реализовал, но по сравнению с BinaryStream они работаю много медленнее. А хотелось бы не терять производительность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2013, 19:48:11 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Insane_1990, плюс кодировка базы и java - совпадает, везде UTF-8 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2013, 19:50:54 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Insane_1990дело в том, что в дальнейшем мне нужен именно InputStream, для записи в NoSQL базу данных. (метод PutLob требует значение в виде Потока). Лучше поискать вариант с хранением текста. Хотя.. Insane_1990Стандартные методы я реализовал, но по сравнению с BinaryStream они работаю много медленнее. А хотелось бы не терять производительность. В принципе, логично. Просто скопировать байты будет намного быстрее. Но я вам объясняю почему ваш код не работает, это к вопросу копирования отношения не имеет. Обратите внимание, что чтение CLOB не единственная проблема в приведенном выше коде. То есть у вас есть InputStream, его надо использовать в методе pubLob, то к чему тогда все эти вопросы с выводом\перекодировкой? Запустите с -Dfile.encoding=UTF-8 Либо так new InputStreamReader(simpleValueStream, "UTF-8"); строки с перекодировкой выкинуть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2013, 20:17:17 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Insane_1990Insane_1990, плюс кодировка базы и java - совпадает, везде UTF-8 Угу. Тогда бы вопросов не возникало. Покажите текст, который выводиться до того как вы перекодировку применяете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2013, 20:18:04 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, по поводу кодировки я писал в самом первом сообщении =) Charset.defaultCharset() = UTF-8. Кодировка в базе - UTF-8. Blazkowicz То есть у вас есть InputStream, его надо использовать в методе pubLob, то к чему тогда все эти вопросы с выводом\перекодировкой? Вопросы потому, что в дальнейшем я хочу посмотреть записанные данные из NoSQL хранилища. и когда я прошу его по ключу показать значение, то вводит он полную лабуду, а конкретно знаки вопросов=) Не CLOb и BLOB парсятся и копируются немного по другому, с другими типами все ок. Даже с BLOB нет проблем. Проблемы именно с CLOB. По поводу текста перед перекодировки - я уже писал, опять таки в первом сообщении. В базе он выглядит так: Если Наташино здоровье позволяет, хотелось бы чаще видеть ее на моих уроках. Дальше сразу идет поток байт, поэтому по всей видимости баг где то тут.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2013, 20:30:52 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Insane_1990По поводу текста перед перекодировки - я уже писал, опять таки в первом сообщении. В базе он выглядит так: Если Наташино здоровье позволяет, хотелось бы чаще видеть ее на моих уроках. Дальше сразу идет поток байт, поэтому по всей видимости баг где то тут.... Если первый System.out.println(line) уже выводит вопросительные знаки, то текст безвозвратно утерян. Дальнейшие манипуляции - мертвому припарка. Давайте тогда так. Сделайте текст из одной-двух русских букв. И покажие в hex все байты вычитаные из getkeyResultSet.getBinaryStream() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2013, 20:59:45 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
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 и т.д..Это все с тем сообщением. К сожалению туда не могу сейчас ввести данные, сейчас на локальной введу, и скажу как поведет себя локальная база. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2013, 21:15:22 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Insane_1990, http://docs.oracle.com/cd/F49540_01/DOC/java.815/a64685/basic4.htm тогда нужно ковырять настройки оракла и драйвера, в Java коде уже поздно что-то делать если увас уже текст потерян. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2013, 23:11:51 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, думаете проблема в базе? Это странно, потому что кодировка одинаковая... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 00:21:18 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, и кстати, если делать не BinaryStream, а просто getString, то все окей... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 00:23:36 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Insane_1990Blazkowicz, думаете проблема в базе? Это странно, потому что кодировка одинаковая... Скорее в драйвере, но возможно она вызвана проблемами в базе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 08:00:36 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, а может быть проблема в типе подключения ? Имеется ввиду драйвер подключения - thin или oci? у меня стоит thin. пробовал oci - ругается на несовместимость платформ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 11:02:21 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Insane_1990, а что возвращается при использовании getCharacterStream? Только исходное значение, до всяческих приседаний с кодировками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 11:29:50 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
just_vladimir, при использовании getCharacterStream возвращается следующее: Reader r = getkeyResultSet.getCharacterStream(2); [Е,с,л,и, ,н,а,т,а,ш,и,н,о, ,з,д,о,р,о,в,ь,е, ,п,о,з,в,о,л,я,е,т,,, ,х,о,т,е,л,о,с,ь, ,б,ы, ,ч,а,щ,е, ,в,и,д,е,т,ь, ,е,е, ,н,а, ,м,о,и,х, ,у,р,о,к,а,х,.] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 11:38:36 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Insane_1990а может быть проблема в типе подключения ? Имеется ввиду драйвер подключения - thin или oci? у меня стоит thin. пробовал oci - ругается на несовместимость платформ Были бы исходники, можно было бы подебажить, посмотреть как драйвер текст в двоичные данные переводит. Но Оракл, кажется, их не предоставляет. Вообще странно. 3F это уже вопросительные знаки. Совершенно не понятно почему getBinaryStream сразу их возвращает. Единственный вариант, если он пытается текст привести к ASCII или другому 8-битному формату и все символы, уже за его пределом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 11:40:16 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
А покажите NLS_CHARACTERSET и другие переменные. Сервер точно в UTF-8? Оракл такая хитрожопая фигня, что он может хранить в текущей клиентской кодировке, при этом находясь в WE8ISO8859. В этом случае он дефолтными методами отдаёт исходный текст более менее нормально, но шаг влево, шаг вправо уже интересности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 11:44:39 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Код: plsql 1. 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 11:52:24 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Insane_1990, а чем getCharacterStream не подходит? В самый край можно и deprecated метод getUnicodeStream, если нужен именно InputStream. А так по идее CharacterStream для CLOB, BinaryStream для BLOB и все замечательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 11:57:45 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Может конвертнуть как-то на уровне запроса? http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_lob.htm#i1020355 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 11:58:14 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=226&tid=2129237]: |
0ms |
get settings: |
15ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
16ms |
get forum data: |
4ms |
get page messages: |
85ms |
get tp. blocked users: |
2ms |
| others: | 316ms |
| total: | 491ms |

| 0 / 0 |
