Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Struts Кодировка из UTF-8 в Сp1251 
:(
    Опции темы
seth
Дата 24.9.2006, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 4.6.2006

Репутация: 1
Всего: 1



Есть jsp и bean (в котором описаны функции для загрузки или записи строки в БД)
БД MySql с cp1251

если на jsp выставлять кодировку utf-8 то с БД читается все нормально
если на jsp выставлять кодировку cp1251 то записуется в БД все нормально

есть одна страничка на которой совмещены эти функции: соответственно необходимо преобразовывать... Пробовал это:

String newString = new String(oldString.getBytes("UTF-8"), "Cp1251");
не хочет... smile

кто что посоветует??


--------------------
PM MAIL   Вверх
Nobody
Дата 24.9.2006, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 25.8.2003
Где: Россия, Москва

Репутация: 1
Всего: 16



Посоветую выкинуть 1251 и делать всё в юникоде.


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
Tony
  Дата 24.9.2006, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

Репутация: 6
Всего: 12



Цитата(Nobody @ 24.9.2006,  17:56)
Посоветую выкинуть 1251 и делать всё в юникоде.

Согласен.Пиши всё в UTF-8.


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
seth
Дата 26.9.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 4.6.2006

Репутация: 1
Всего: 1



Цитата(Tony @ 24.9.2006,  21:03)
Цитата(Nobody @ 24.9.2006,  17:56)
Посоветую выкинуть 1251 и делать всё в юникоде.

Согласен.Пиши всё в UTF-8.

хммм - на UTF-8 ничего не получилось - написал на 1251 (т.к. БД в 1251)


--------------------
PM MAIL   Вверх
tux
Дата 27.9.2006, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(seth @  26.9.2006,  23:39 Найти цитируемый пост)
хммм - на UTF-8 ничего не получилось - написал на 1251 (т.к. БД в 1251) 

А какая связь между БД в 1251 и веб-страницей в 1251?
PM MAIL Skype GTalk Jabber YIM   Вверх
Maksym
Дата 27.9.2006, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



seth
Что имеется в виду под "ничего не получилось"? где именно сбоит кодировка?
PM MAIL   Вверх
seth
Дата 27.9.2006, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 4.6.2006

Репутация: 1
Всего: 1



Цитата(Maksym @ 27.9.2006,  10:24)
seth
Что имеется в виду под "ничего не получилось"? где именно сбоит кодировка?

Цитата

если на jsp выставлять кодировку utf-8 то с БД читается все нормально
если на jsp выставлять кодировку cp1251 то записуется в БД все нормально



--------------------
PM MAIL   Вверх
Maksym
Дата 28.9.2006, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



Вот такое дело где-нибудь присутствует:
request.setCharacterEncoding("UTF-8");
?
PM MAIL   Вверх
seth
Дата 28.9.2006, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 4.6.2006

Репутация: 1
Всего: 1



Цитата(Maksym @ 28.9.2006,  12:19)
Вот такое дело где-нибудь присутствует:
request.setCharacterEncoding("UTF-8");
?

пробовал - не помогает... smile
проблема решилась с установкой кодировки в windows-1251

Это сообщение отредактировал(а) seth - 28.9.2006, 23:12


--------------------
PM MAIL   Вверх
Stampede
Дата 29.9.2006, 00:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



seth, тут похоже вот что происходит. В браузер-серверном взаимодействии есть несколько мест, где программным компонентам требуется знать кодировку. Давай сначала рассмотрим ситуацию с чтением из базы - то, что ты называешь:
Цитата(seth @  24.9.2006,  03:52 Найти цитируемый пост)
если на jsp выставлять кодировку utf-8 то с БД читается все нормально

Ты говоришь, что база в 1251. Значит, драйвер базы все делает правильно, и база тут вообще ни при чем. То есть дело в том, как происходит конвертация между внутренним представлением символов Java (Unicode) и тем, как они передаются по сети и/или отображаются в браузере. Поэтому давай по порядку.

Сначала тебе надо засунуть твой вывод в поток в правильной кодировке. Для этого существует метод response.setCharacterEncoding("UTF-8"). Можно также воспользоваться методом response.setContentType("text/html;charset=UTF-8") - это приведет к такому же эффекту.

Но здесь имеются всякие подводные грабли, о которых следует знать. Во-первых, установка кодировки ответа должна быть произведена до первого обращения к response.getWriter(). Это потому что выводной поток создается сразу в той кодировке, которая указана (или дефолтной, 8859-1). Так что если поток уже создан, все последующие попытки установить какую бы то ни было кодировку игнлрируются.

У тебя как у разработчика не всегда есть контроль над тем, в какой момент происходит получение Writer'а, поэтому одно из простых решений - это написать фильтр, который будет выставлять нужную кодировку еще до всякой обработки. Правда, это подходит только для ситуаций, когда кодировка одна для всего сайта. Именно поэтому есть смысл прислушаться к мнению товарищей, предлагавших тебе все делать в UTF-8, ибо с ней можно вообще забыть, что есть какая-то проблема кодировок. Более того, с UTF-8 становится возможным выводить на странице смесь на разных языках, и каждый язык будет отображаться корректно.

В случае с JSP возникает еще одна проблема: там выражение <%@ page contentType="text/html;charset=UTF-8" %> в том числе сообщает контейнеру о том, в какой кодировке читать исходный JSP файл. Поэтому если выводим в UTF-8, то и JSP файл нужно сохранять в UTF-8, а не то получим вопросики вместо русских букв.

Ты говоришь, что при кодировке UTF-8 русские буквы из базы отображаются нормально. Хорошо, давай для начала убедимся, что все присходит так, как мы думаем должно происходит. Например, узнаем, какие заголовки приходят со страницей. Это можно посмотреть, например, в Firefox с устагновленным плагином Web Developer Extension.

Еще хорошо было бы узнать, не прописан ли мета-тег <meta http-equiv="Content-Type" content="..."> внутри тега <head> приходящей страницы, и если да, то что там внутри атрибута content.

Дальше будем плясать от этого.

Добавлено @ 00:40 
Цитата(seth @  28.9.2006,  14:10 Найти цитируемый пост)
проблема решилась с установкой кодировки в windows-1251


Пока писал ответ, пришло сообшение о решении проблемы. Я только хочу предупрелить 
seth, что это не решение, а лишь отсрочка. Потому что где-то что происходит не так, как должно происходить. Например, для меня это означает, что браузер шлет POST-данные в windows-1251 - и скорее всего только потому, что это умолчальная локаль на данном конкретном компьютере. Если попробовать то же самое с машины, где локаль английская, то скорее всего в базу попадут кракозябры. Между тем браузер обязан засылать ввод в той кодировке, в котрой получил страницу. Так что давай все-таки смотреть на заголовки ответа.
PM WWW   Вверх
Maksym
Дата 29.9.2006, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



Stampede
Великолепный ответ, аплодирую!  smile 
Цитата
Сначала тебе надо засунуть твой вывод в поток в правильной кодировке. Для этого существует метод response.setCharacterEncoding("UTF-8"). Можно также воспользоваться методом response.setContentType("text/html;charset=UTF-8") - это приведет к такому же эффекту.

Но здесь имеются всякие подводные грабли, о которых следует знать. Во-первых, установка кодировки ответа должна быть произведена до первого обращения к response.getWriter(). Это потому что выводной поток создается сразу в той кодировке, которая указана (или дефолтной, 8859-1). Так что если поток уже создан, все последующие попытки установить какую бы то ни было кодировку игнлрируются.

По этому поводу, tux дал готовый рецепт здесь.

PM MAIL   Вверх
seth
Дата 30.9.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 4.6.2006

Репутация: 1
Всего: 1



Спасибо за ответ - к сожалению ничего конкретного добавить не могу - необходимо было перенастраивать систему smile
ну могу кое что добавить - таблицу в mysqle сделал на utf-8

На страничке такое:
Код

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%@ taglib prefix="html" uri="/tags/struts-html"%>
<%@ taglib prefix="bean" uri="/tags/struts-bean"%>
<html:html locale="true">
<head>
    <META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8" />


при дебаге в бин приходит такое:

Õàðüêîâ

т.е. вроде UTF-8 и все правильно - только на страничке отображается точно также (т.е. крокозябры)


--------------------
PM MAIL   Вверх
tux
Дата 30.9.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



seth, вот это:
Цитата(seth @  30.9.2006,  18:14 Найти цитируемый пост)
Õàðüêîâ

совсем не то, что должно быть, должны быть обычные русские буквы. Как ты выполняешь подключение к MySQL? У тебя в url подключения есть параметры useUnicode и characterEncoding? Строка подключения должны выглядеть примерно так:
Код

jdbc:mysql://<host>/<database>?useUnicode=true&characterEncoding=utf-8

PM MAIL Skype GTalk Jabber YIM   Вверх
Stampede
Дата 30.9.2006, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Цитата(seth @  30.9.2006,  04:14 Найти цитируемый пост)
при дебаге в бин приходит такое:

Õàðüêîâ


Вот это, кстати, выглядит обнадеживающе (я могу даже сказать, что там написано что-то про твой город smile). Остается только уточнить, что за бин и чем смотрим. Не исключено, что все как раз хорошо. 

И по прежнему нет ответа на жизненно важный вопрос: какие заголовки HTTP приходят со страницей.
PM WWW   Вверх
seth
Дата 30.9.2006, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 4.6.2006

Репутация: 1
Всего: 1



Цитата(tux @ 30.9.2006,  13:35)
seth, вот это:
Цитата(seth @  30.9.2006,  18:14 Найти цитируемый пост)
Õàðüêîâ

совсем не то, что должно быть, должны быть обычные русские буквы. Как ты выполняешь подключение к MySQL? У тебя в url подключения есть параметры useUnicode и characterEncoding? Строка подключения должны выглядеть примерно так:
Код

jdbc:mysql://<host>/<database>?useUnicode=true&characterEncoding=utf-8

прописал это в подключении - ничего не изменилось smile

вотъ бин

   
Код

public String getFolder(int id){
        ResultSet rs;
        String formatted="";
        try{
            Class.forName(class_name);
            Connection con=DriverManager.getConnection(url, user, password);
            Statement st=con.createStatement();
            rs=st.executeQuery("select * from "+table_name+" where parentId="+id+" AND isParam='N'");
            formatted=formatChildrenJS(rs);
            rs.close();
            st.close();
            con.close();
        } catch (ClassNotFoundException e){
            error="Class not found org.gjt.mm.mysql.Driver";
        }
        catch (SQLException e){
            error="Can't establish connection to "+url;
        }
        return formatted;
    }
    private String formatChildrenJS(ResultSet rs) throws SQLException {
        StringBuffer l_ch = new StringBuffer();
        while (rs.next()){
            String parent;
            if (rs.getInt("parentId")==0) //aka Root
                parent="Root";
            else parent="vart["+rs.getInt("parentId")+"]";
            String self="vart["+rs.getInt("id")+"]";
            String link="\"javascript:go('ViewSection.do?id="+rs.getInt("id")+"');\"";
            String text=rs.getString("text");
            text=text.replace("\\", "\\\\");
            text=text.replace("\"", "\\\"");
            if (parent.equals("Root")) { //добавление картинок - если в root
                String folderIcon="foldericon.png"; //default
                String folderOpenIcon="openfoldericon.png";  //default
                if (rs.getString("folderIcon")!=null && !rs.getString("folderIcon").equals("")) folderIcon=rs.getString("folderIcon");
                if (rs.getString("folderOpenIcon")!=null && !rs.getString("folderOpenIcon").equals("")) folderOpenIcon=rs.getString("folderOpenIcon");
                l_ch.append(self+"=new WebFXTreeItem(\""+text+"\", "+link+", "+parent+", 'icons/" +folderIcon+
                        "', 'icons/"+folderOpenIcon+"');\n");
            }
            else
                l_ch.append(self+"=new WebFXTreeItem(\""+text+"\", "+link+", "+parent+");\n");
            l_ch.append(getFolder(rs.getInt("id")));
        }
        return l_ch.toString();
    }


строка подключения:
jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf-8

ЗЗЫ про заголовки - сейчас буду смотреть - хотя нужно ли это на данный момент - пока запись в БД мы не обсуждаем...

ЗЗЗЫ использую коннектор mysql-connector-java-3.0.11-stable-bin.jar 

Это сообщение отредактировал(а) seth - 30.9.2006, 19:57


--------------------
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1382 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.