Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/30: Рейтинг темы: голосов - 30, средняя оценка - 4.57
lavan
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
1

проблема с русским языком

16.10.2011, 15:24. Просмотров 5568. Ответов 14
Метки нет (Все метки)

народ подскажите кто знает!
имею базу данных с значениями полей как на русском так и на англ создавал так
SQL
1
2
3
4
5
SET character_set_client=cp1251;
SET charachter_set_server=cp1251;
SET character_set_results=cp1251;
...
INSERT INTO TABLES VALUES('engleash text','русский текст');
если работаю через консоль mysql все отображается как надо,а когда подключаюсь через JDBC русский текст отображается кряказябрами подключаюсь так
Java
1
2
3
4
5
6
7
8
Class.forName("com.mysql.jdbc.Driver");
        Properties p=new Properties();
    String url="jdbc:mysql://localhost/adept_system",pas="1234",name="root";
    p.put("user",name);
    p.put("password",pas);
    //p.put("useUnicode", "true");//и использовал и нет
    p.put("charSet","Cp1251");//писал и так "chracterEncoding","Cp1251"
    con=DriverManager.getConnection(url,p);
Делеал нужные установки
Java
1
2
3
4
st.executeUpdate("set character_set_client=cp1251");
    st.executeUpdate("set character_set_server=cp1251");
    st.executeUpdate("set character_set_results=cp1251");
    st.executeUpdate("set character_set_connection=cp1251");
ничего не помагает,русский язык не отображается
Java
1
2
3
4
5
6
7
ArrayList<String>tmp=new ArrayList<String>();
      try{
      while(rs.next()){
          int size=rs.getMetaData().getColumnCount();
          for(int i=1;i<size;i++){
              tmp.add(rs.getString(i));//ЗДЕСЬ кряказябры
          }
КАК ЭТО ИСПРАВИТЬ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2011, 15:24
Ответы с готовыми решениями:

Struts с кодировкой UTF-8 и русским - кракозябры
Работают фильтры. Только что столкнулся с такой же проблемой сам сделал через...

Начинаю разбираться с языком Java, непонятны некоторые моменты
вот сам код одномерного массива с переворотом его, непонятно зачем нужно...

Посоветуйте примеры кода по Java. Теория прочтена, но с языком Java не знакома
Или может кто может дать готовый код. В теории вроде бы не очень сложно. :cry:...

Проблема с русским языком
В VB6 если в коде переключить язык ввода на русский, то печатает абракадабру....

HTMLEncode - Проблема с русским языком
Заранее извиняюсь, если кому то вопрос покажется глупым. В процессе изучения...

14
mutagen
2565 / 2238 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
16.10.2011, 15:48 2
если java и jdbc работает на linux, засеть локаль в перед запуском java программы
Bash
1
export LC_ALL=ru_RU.cp1251
у меня в базе cp1251, а системная utf8
мне помогло
Bash
1
export LC_ALL=ru_RU.utf8
но у меня проблема была что у cron локаль по умолчанию C

у тебя же может быть ещё один прикол, в яве всё уникод по умолчанию так что перед закидкой в базу надо перекодировать в cp1251
getBytes с utf8 и нью стринг из байтов с cp1251
0
lavan
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
16.10.2011, 16:08  [ТС] 3
О.С Windows. я пока ничего не записывал из приложения в базу.Существующие строки были созданы в консоли mysql.Перекодировка по месту getBytes с utf8 и нью стринг из байтов с cp1251
делеал так
Java
1
2
3
4
String str;
str=rs.getString(1);//Взяли строку Я так понимаю в UTF-8
byte m[]=str.getBytes("Cp1251");
str=m.toString;//Тоже не выходит
Может я здесь что то не правильно делаю?Хотелсь бы видеть пример
0
mutagen
2565 / 2238 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
16.10.2011, 16:46 4
если ты всё делал по умолчанию в винде, то кодировка символов в базе у тебя уже Cp1251 и тебе надо установить в коннекторе characterEncoding=Cp1251, а уже потом перекодировать его для java
и главное регистр Cp1251 - важен

Добавлено через 1 минуту
сетить лучше jdbc:mysql://localhost/some_db?useUnicode=yes&characterEncoding=Cp1251 чем через property

Добавлено через 47 секунд
String message = new String( rs.getBytes("message"), "Cp1251");

c useUnicode=yes я не уверен, проверь no тоже
0
lavan
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
16.10.2011, 16:51  [ТС] 5
Все это я делал!!! кроме
"c useUnicode=yes я не уверен, проверь no тоже"
попробовал,не пашет
0
mutagen
2565 / 2238 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
16.10.2011, 17:41 6
а глянь как в базе у тебя кодировка стоит, у меня подозрение что latin1, а тебе для java лучше всего utf8 поставить, чтобы избавиться от рекодинга постоянного, опять же и проблемы с другими языками и спецсимволами исчезнут сами собой
0
lavan
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
16.10.2011, 17:45  [ТС] 7
ты имеешь в виду переменную
character_set_database;//?
если да то
SQL
1
character_set_database=utf8;
0
mutagen
2565 / 2238 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
16.10.2011, 17:49 8
http://www.lissyara.su/articles/freebsd/www/mysql_charsets/
посмотри что у тебя за конфиг и выбери подходящий для русского utf8 или cp1251

Добавлено через 55 секунд
этот collation можно сетить отдельно на таблицу, убедись что на нужно таблице такой как нужен

Добавлено через 1 минуту
Цитата Сообщение от lavan Посмотреть сообщение
character_set_database=utf8;
похоже у тебя база в utf8 а ты пытаешься cp1251, перепиши ка всё так чтобы было utf8 в коннекторе и перекодировка getBytes тоже
0
lavan
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
17.10.2011, 14:00  [ТС] 9
на счет статьи которую ты дал:я не могу поместить в таблицу русский текст пока не сделаю
SQL
1
SET character_set_client=cp1251
Хотя получается какая то фигня,одну строку на русском я положил не изменяя ничего а вот вторую уже не дает пишет:ошибка не знакомые символы

Добавлено через 19 часов 38 минут
Добрался до возврата русских букв,только возвращаются не те буквы которые в базе! все это выполняю в консоли mysql
SQL
1
character_set_database=utf8
для того чтобы заполнить таблицу делаю
SQL
1
SET names cp1251
теперь могу вносить русский текст!и при работе в консоли все работает.
Теперь подключаюсь через JDBC использую драйвер mysql-connector-java-5.1.6-bin.jar
Java
1
2
3
4
5
6
7
8
9
10
11
public void dbConnect() throws ClassNotFoundException,SQLException{//подкл к б.д
        Class.forName("com.mysql.jdbc.Driver");
        Properties p=new Properties();
    String url="jdbc:mysql://localhost/adept_system",
            pas="1234",name="root";
    p.put("user",name);
    p.put("password",pas);
    //p.put("useUnicode", "true");//подключал и отключал
    p.put("charSet","Cp1251");//вставлял и utf8
    con=DriverManager.getConnection(url,p);
    }
Настройка для текущего подключения
Java
1
2
3
4
5
public void localAdjust()throws SQLException{
    st.executeUpdate("set names 'cp1251'");//заменяет client,server,results
    st.executeUpdate("set character_set_connection=cp1251");
    st.executeUpdate("set collation_connection='cp1251_general_ci'");
}
Теперь здесь
Java
1
2
3
4
5
6
while(rs.next()){
          int size=rs.getMetaData().getColumnCount();
          for(int i=1;i<=size;i++){
              String s=rs.getString(i);
              String ss=new String(rs.getBytes(i),"Cp1251");
          }
отображаются русские буквы,но я ввел(например) "ячс" а отобразилось "пзб" ЧТО за фигня?
0
mutagen
2565 / 2238 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
17.10.2011, 19:13 10
Ты полностью все смешал:-) давай по пунктам 1. Выбери русскую кодировку в базе и больше не трогай. 2. Настрой коннектор под нее. Каждый раз когда ты сетишь колднйшн ты альтеришь всю таблицу, не делай этого в яве
0
lavan
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
18.10.2011, 16:36  [ТС] 11
вобщем решил как получить русский текст,но почему это происходит не понимаю.
для того чтобы внести данные в б.д на русском мне надо сделать настройки
SQL
1
2
SET character_set_client=cp1251
SET character_set_results=cp1251
этим,как я понимаю, я говорю mysql как интерпретировать и хранить мою строку? если да то сбой происходит при коннекте,т.е в JDBC драйвере.Хоть я явно указал кодировку возврата
Java
1
2
st.executeUpdate("set character_set_client=cp1251");
    st.executeUpdate("set character_set_results=cp1251");
Возврат происходит не понятно в какой кодировке но получить русский текст получилось только так
Java
1
String str=new String(rs.getBytes(i),"Cp866");
причем если заменить Cp866 на Cp1251 то получаю русский текст но не те буквы которые находятся в б.д
вот и спрашивается,что за х...я????????
0
mutagen
2565 / 2238 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
18.10.2011, 18:08 12
Эти твои апдейты лишние, кодировку устанавливать нужно только в коннекторе

Добавлено через 2 минуты
Поставь коллейшн в дб utf8 и настрой коннектор на неё и все
0
lavan
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
18.10.2011, 19:07  [ТС] 13
покажи пример!
Поставь коллейшн в дб utf8 и настрой коннектор на неё и все
0
mutagen
2565 / 2238 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
19.10.2011, 10:54 14
напимер в таблице стоит utf8-default collation
коннектор при этом
Java
1
dbConnection = DriverManager.getConnection("jdbc:mysql://localhost/db_name?zeroDateTimeBehavior=convertToNull&characterEncoding=UTF8","user", "pass");
а из результсета достаём так

Java
1
rs.getString("column_name")
а кладём туда так (я использую PreparedStatement для ускорения, но в принципе оно на обычном апдейте такое же)

Java
1
2
3
4
5
6
7
// проблема кодировки
                    try {
                        ps.setString(19, new String(person.getAddress().getBytes(), "UTF-8"));
                    } catch (UnsupportedEncodingException e) {
                        ps.setString(19, "UnsupportedEncodingException");
                        log.error(e);
                    }
Добавлено через 5 минут
и не смешивай mysl нативный клиент и поведение java с jdbc коннектором, таким образом ты только вносишь путанницу. Двигайся архитектурно так.
1. настроить DB движок (myisam, innodb, etc)
2. выбрать default collation для всей DB
3. Опционально! альтернуть некоторые таблицы в custom collation там где есть необходимость.
4. настроить jdbc коннектор на драйвер mysql с кодировкой (collation ) DB
5. использовать конструкцию new String(string.getBytes(), "collation-encoding")) для правильной загрузки в базу.
0
lavan
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
19.10.2011, 20:52  [ТС] 15
насколько я понимаю, colletion-это связано с сортировкой,а кодировка это character encoding. Причем,в принципе они могут не совпадать?
0
19.10.2011, 20:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2011, 20:52

OJB + Firebird проблема с русским языком
Ломается кодировка при занесении русских букв. при создании БД указана...

Проблема с русским языком в ListBox и ComboBox
В Windows XP в VB6 приложении русский язык нормально отображается в Label и...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru