|
|
|
Проблемы с кодировкой в 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 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
just_vladimirInsane_1990, а чем getCharacterStream не подходит? В самый край можно и deprecated метод getUnicodeStream, если нужен именно InputStream. А так по идее CharacterStream для CLOB, BinaryStream для BLOB и все замечательно. Ему нужно в бинарное хранилище поместить. Говорит что долго. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 11:59:39 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Кстати интересно. Нужно взять CLOB в Oracle RDBMS и поместить в LOB в Oracle NoSQL. Возникает вопрос. Зачем тут JDBC? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 12:00:25 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, а как иначе мне связываться с базой реляционной? =) я беру ведь не только LOB из РБД, а то, что выберет пользователь. с BLOB все хорошо, там Binary Stream, там байты, и в хранилище записываются байты. Если использовать CharacterStream, то это будет дольше чем обычный бинарный, потому что все равно в NoSQL хранятся байты, и будет происходить та же конвертация в байты символов...проще конечно же сразу получать поток байтов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 12:05:14 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Insane_1990Если использовать CharacterStream, то это будет дольше чем обычный бинарный, потому что все равно в NoSQL хранятся байты, и будет происходить та же конвертация в байты символов...проще конечно же сразу получать поток байтов. Вы меряли? Реально дольше просто вычитать текст? Только не вычитывайте в String, заверните в BufferedReader и вычитайте посимвольно. Действительно ли сильно дольше в сравнении с BLOB? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 12:08:45 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Insane_1990, 1. А с getUnicodeStream то работает все таки или нет? 2. Как часто выполняются эти операции, какие объемы данных, уверены, что не занимаетесь экономией на спичках, пытаясь работать именно с BinaryStream ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 12:09:08 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
just_vladimir, метод getUnicodeStream выдал ошибку: getUnicodeStream not implemented for class oracle.jdbc.driver.T4CClobAccessor. по поводу быстроты переноса, сейчас отпишусь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 12:18:04 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, смотрите, как я сделал обычные методы, без getBinaryStream. Я просто смотрю какой тип столбца, и в зависимости от этого делаю поток: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Support.ParseKey.ParseValue - метод, который преобразует текст в байты, и возвращает уже набор байт.... возможно я тут делаю что то лишнее, потому так долго. Но могу сказать одно, сейчас вот программа работает. Когда идет binaryStream - записывается примерно по 4000 в секунду, сейчас же - максимум по 30 в секунду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 12:28:11 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Insane_1990, Ещё бы. Я же говорил выше не используйте ничего связаного со String. ByteArray*Stream тоже не нужен. Берете вот это класс http://commons.apache.org/proper/commons-io/javadocs/api-release/index.html?org/apache/commons/io/input/package-summary.html и для CLOB получаете InputStream вот так: new ReaderInputStream(new BufferedReader(resultSet.getCharacterStream(2))); Далее от работы с BLOB ничем не отличается. Вы же вместо этого читаете целиком всё в память. Зачем??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 12:34:30 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Спасибо большое! Теперь посыпались ислючения Java heap space... =( И все же, интересно что не так с binaryStream ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 13:01:57 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Insane_1990Спасибо большое! Теперь посыпались ислючения Java heap space... =( Раньше не было??? Insane_1990И все же, интересно что не так с binaryStream Где-то внутри драйвера, или даже на уровне базы, он пытается текст интерпретировать в ASCII или другой 8-битной кодировке. При этом в UTF он видит символы вне ASCII range и заменяет их вопросами. В общем, это лучше уже оракловедов пинать. Это, кстати, наводит на мысль что данные уже имеются в виде текста, а getBinaryStream читает именно текст. Поэтому никакого прироста к производительности он не даст. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 13:06:57 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, нет, раньше не было... сейчас пишет: Exception in thread "Thread-5" Exception in thread "Thread-9" java.lang.OutOfMemoryError: Java heap space Exception in thread "Thread-17" java.lang.OutOfMemoryError: Java heap space Exception in thread "Thread-11" java.lang.OutOfMemoryError: Java heap space Exception in thread "Thread-7" java.lang.OutOfMemoryError: Java heap space Exception in thread "Thread-21" java.lang.OutOfMemoryError: Java heap space на моменте Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 13:13:14 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, хммм... убрал new BufferedReader. оставил просто ris = new ReaderInputStream(getkeyResultSet.getCharacterStream(2)); стало все окей...325 000 CLOB за 1 минуту ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 13:19:29 |
|
||
|
Проблемы с кодировкой в java
|
|||
|---|---|---|---|
|
#18+
Insane_1990, Странно. Кстати, в доке написано BufferedReader не нужен. Читали? Там внутри и так есть буфер на 1024 по-умолчанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 13:19:32 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2129237]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
14ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 307ms |
| total: | 455ms |

| 0 / 0 |
