Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Struts Кодировка из UTF-8 в Сp1251


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

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

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

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

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

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

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

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

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

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

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

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

А какая связь между БД в 1251 и веб-страницей в 1251?

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

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

Цитата

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

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

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

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

Автор: Stampede 29.9.2006, 00:31
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 с устагновленным плагином http://addons.mozilla.org/firefox/60/.

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

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

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


Пока писал ответ, пришло сообшение о решении проблемы. Я только хочу предупрелить 
seth, что это не решение, а лишь отсрочка. Потому что где-то что происходит не так, как должно происходить. Например, для меня это означает, что браузер шлет POST-данные в windows-1251 - и скорее всего только потому, что это умолчальная локаль на данном конкретном компьютере. Если попробовать то же самое с машины, где локаль английская, то скорее всего в базу попадут кракозябры. Между тем браузер обязан засылать ввод в той кодировке, в котрой получил страницу. Так что давай все-таки смотреть на заголовки ответа.

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

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

По этому поводу, tux дал готовый рецепт http://forum.vingrad.ru/index.php?showtopic=94717.

Автор: seth 30.9.2006, 13:14
Спасибо за ответ - к сожалению ничего конкретного добавить не могу - необходимо было перенастраивать систему 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 и все правильно - только на страничке отображается точно также (т.е. крокозябры)

Автор: 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

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

Õàðüêîâ


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

И по прежнему нет ответа на жизненно важный вопрос: какие заголовки HTTP приходят со страницей.

Автор: seth 30.9.2006, 19:16
Цитата(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, 20:01
Эти заголовки имелись ввиду?

Response Headers - http://localhost:8080/gg/index.jsp

Server: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Content-Length: 323
Date: Sat, 30 Sep 2006 17:00:19 GMT

200 OK


Если нет - то где в этом плагине посмотреть то что надо?

Автор: Stampede 30.9.2006, 23:07
Цитата(seth @  30.9.2006,  11:01 Найти цитируемый пост)
Эти заголовки имелись ввиду?


Да, эти. Теперь убедись, что "Content-Type: text/html;charset=UTF-8" присутствует и на той странице, на которой ты просматриваешь результаты, и на той, откуда засылаешь POST. Если все в порядке, то следующее, на что будем смотреть, это кодировка входящего запроса. Например, на странице JSP можно написать так:

Код

<p>Request encoding: <%= request.getCharacterEncoding(); %>
</p>


Автор: seth 30.9.2006, 23:46
Цитата(Stampede @ 30.9.2006,  23:07)
Цитата(seth @  30.9.2006,  11:01 Найти цитируемый пост)
Эти заголовки имелись ввиду?


Да, эти. Теперь убедись, что "Content-Type: text/html;charset=UTF-8" присутствует и на той странице, на которой ты просматриваешь результаты, и на той, откуда засылаешь POST. Если все в порядке, то следующее, на что будем смотреть, это кодировка входящего запроса. Например, на странице JSP можно написать так:

Код

<p>Request encoding: <%= request.getCharacterEncoding(); %>
</p>

Давайте для начала разберемся с выборкой из БД

Заголовок jsp на который выводятся данные я уже приводил
Код


<%@ 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" />

бин тоже показывал

<%=request.getCharacterEncoding()%>
выдает 
null

Автор: 3x3 1.10.2006, 00:27
А как вы передаёте сервлету строку для вставки? В URL?

Автор: seth 1.10.2006, 00:29
Цитата(3x3 @ 1.10.2006,  00:27)
А как вы передаёте сервлету строку для вставки? В URL?

использую struts

Автор: 3x3 1.10.2006, 00:35
Цитата(seth @ 1.10.2006,  00:29)
Цитата(3x3 @ 1.10.2006,  00:27)
А как вы передаёте сервлету строку для вставки? В URL?

использую struts

Откуда берётся строка - из браузера?

Автор: seth 1.10.2006, 00:44
Цитата(3x3 @ 1.10.2006,  00:35)
Цитата(seth @ 1.10.2006,  00:29)
Цитата(3x3 @ 1.10.2006,  00:27)
А как вы передаёте сервлету строку для вставки? В URL?

использую struts

Откуда берётся строка - из браузера?

давайте для начала разберемся с выборкой из БД...

Автор: Stampede 1.10.2006, 01:01
Да, вот еще какую полезную вещь можно сделать: поменяй в форме method="post" на method="get", и тогда в адресной строке браузера адрес целевой страницы в части после знака вопроса будет содержать закодированную кириллическую строку. Любопытно было бы взглянуть, что она из себя представляет.

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

Автор: 3x3 1.10.2006, 01:02
Цитата(seth @ 1.10.2006,  00:44)
Цитата(3x3 @ 1.10.2006,  00:35)
Цитата(seth @ 1.10.2006,  00:29)
Цитата(3x3 @ 1.10.2006,  00:27)
А как вы передаёте сервлету строку для вставки? В URL?

использую struts

Откуда берётся строка - из браузера?

давайте для начала разберемся с выборкой из БД...

Она же у вас читается нормально в режиме UTF-8? Или я вас неправильно понял?

Добавлено @ 01:10 
Цитата(Stampede @ 1.10.2006,  01:01)
Да, вот еще какую полезную вещь можно сделать: поменяй в форме method="post" на method="get"

Он вроде не писал ничего про форму. При таких хидерах как выше и гетом буквы пойдут в форме %uXXXX. 
Поэтому сначала надо разобраться откуда вообще приходит строка в неправильной кодировке.

Автор: Stampede 1.10.2006, 01:22
Цитата(3x3 @  30.9.2006,  16:02 Найти цитируемый пост)
При таких хидерах как выше и гетом буквы пойдут в форме %uXXXX. 


А вот в этом я как-раз и не уверен. Должны - да. Но судя по тому, что 
seth упоминал ранее, есть сильное подозрение, что приходит уже в 1251. Вот цитата:

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

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


Поэтому я и говорю, хотелось бы увидеть запрос браузера в чистом виде.

Автор: 3x3 1.10.2006, 01:54
Цитата(Stampede @ 1.10.2006,  01:22)
Цитата(3x3 @  30.9.2006,  16:02 Найти цитируемый пост)
При таких хидерах как выше и гетом буквы пойдут в форме %uXXXX. 


А вот в этом я как-раз и не уверен. Должны - да. Но судя по тому, что 
seth упоминал ранее, есть сильное подозрение, что приходит уже в 1251. Вот цитата:

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

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


Поэтому я и говорю, хотелось бы увидеть запрос браузера в чистом виде.

Хм.. Воспроизвел проблему. Именно постом оно и кривляется если кодировку в браузере скидываешь на 1251 принудительно..

Добавлено @ 01:56 
еУМЙ РТЙОХДЙФЕМШОП УФБЧЙФШ ОЕРТБЧЙМШОХА ЛПДЙТПЧЛХ, ФП НПЦОП РЕТЕДБФШ УЕТЧЕТХ ОЕРТБЧЙМШОЩЕ ВХЛЧЩ

Автор: Stampede 1.10.2006, 02:47
Цитата
Если принудительно ставить неправильную кодировку, то можно передать серверу неправильные буквы


Шпион Смит, вас разоблачили smile

Автор: 3x3 1.10.2006, 02:57
smile

______


Вобщем воркэраунд для случая seth таков:
В самом начале обработки, до любых обращений к свойствам реквеста, приложение должно сообщить реквесту, в какой кодировке он получил запрос для приложения. В случае JSP-шки это означает, что её первая строка должна выглядеть так:
Код
<% if(request.getCharacterEncoding() == null) request.setCharacterEncoding("UTF-8"); %>




PS
Я потрясён этим обстоятельством... Сервер недопонимает в какой кодировке ему пришли данные POSTом.

Автор: Stampede 1.10.2006, 03:27
Цитата(3x3 @  30.9.2006,  17:57 Найти цитируемый пост)
Я потрясён этим обстоятельством... Сервер недопонимает в какой кодировке ему пришли данные POSTом.


Я тоже маленько потрясен. Только не сервером, а браузером. Тем, что он не сообщает, в какой кодировке он шлет данные запроса. А еще JSP. Не знаю, как в других контейнерах, но у меня в Jetty выражение <%@ page contentType="text/html;charset=KOI8-R" %> не приводит к выставлению заголовков ответа HTTP!

Вот так вот, век живи - век учись smile

ЗЫ. Да, и мы еще не знаем, какую роль во всем этом играет Struts, который, как выяснилось, тоже здесь фигурирует smile

Автор: seth 1.10.2006, 10:39
Уххххх - понаписывали smile
Я ведь чуть позже писал что перевел базу на UTF-8.....
и теперь не могу прочитать оттуда - с записью в БД даже не хочу еще разбиратся пока не будет нормально выводится....
поскольку Mysql 5 то судя по всему просто мой коннектор не поддерживает такое различие кодировок - либо надо качать новый коннектор (что проблематично) либо ставить старый mysql с которым все ок....
или мне еще тут чего-нить посоветуют....

Автор: 3x3 1.10.2006, 10:52
Цитата(seth @ 1.10.2006,  10:39)
Уххххх - понаписывали smile
Я ведь чуть позже писал что перевел базу на UTF-8.....
и теперь не могу прочитать оттуда - с записью в БД даже не хочу еще разбиратся пока не будет нормально выводится....
поскольку Mysql 5 то судя по всему просто мой коннектор не поддерживает такое различие кодировок - либо надо качать новый коннектор (что проблематично) либо ставить старый mysql с которым все ок....
или мне еще тут чего-нить посоветуют....

Не трогай базу. Работай в юникоде, как было, а что бы строки в нормальной кодировке были, просто пропиши в начале JSP-страниц:
Код

<% if(request.getCharacterEncoding() == null) request.setCharacterEncoding("UTF-8"); %>


Или в начале кода, отрабатывающего респонс:
Код

if(request.getCharacterEncoding() == null) request.setCharacterEncoding("UTF-8");


Это всё. Всё остальное - как в начале прописывал, укажи для UTF-8:
Код

<%@ page contentType="text/html; charset=UTF-8" language="java" %>




Автор: seth 1.10.2006, 11:02
как говорится - БОЛТ
все по прежнему... smile

Автор: 3x3 1.10.2006, 11:12
Цитата(Stampede @ 1.10.2006,  03:27)
Цитата(3x3 @  30.9.2006,  17:57 Найти цитируемый пост)
Я потрясён этим обстоятельством... Сервер недопонимает в какой кодировке ему пришли данные POSTом.


Я тоже маленько потрясен. Только не сервером, а браузером. Тем, что он не сообщает, в какой кодировке он шлет данные запроса. 





Ну браузер-то шлет.. Иногда в не правильном представлении, отчего, видимо, принципиальные JAVA-программеры и игнорируют такие заголовки. Но опять же есть воркэроунд:
Вон что люди советуют, чтобы не зависеть от противного браузера: добавлять в форму поле 
Код

<input type="hidden" name="_charset_" value="" />

И туда браузер (иногда?) при посте складывать данные о кодировке POSTа. 
Можно использовать для проверки - что там себе пользователь установил, только как потом осуществить указание реквесту его кодировки, ведь она должна быть задана ДО чтения значений формы smile:


Ну и опять же ASP, PHP как-то отрабатывают такую ситуацию без выкрутасов.

Цитата

А еще JSP. Не знаю, как в других контейнерах, но у меня в Jetty выражение <%@ page contentType="text/html;charset=KOI8-R" %> не приводит к выставлению заголовков ответа HTTP!


Под Tomcat отработало правильно. Может у вас в джава-машине не установлена такая локаль?
Я бы начал с того, что попробовал бы поперекодировать строки в/из KOI8-R, если станет генерировать исключения - значит оно.

Цитата

ЗЫ. Да, и мы еще не знаем, какую роль во всем этом играет Struts, который, как выяснилось, тоже здесь фигурирует smile

Struts тут ни при чем.

Добавлено @ 11:16 
Цитата(seth @ 1.10.2006,  11:02)
как говорится - БОЛТ
все по прежнему... smile

Сейчас читает из базы нормально в UTF-8? В браузер выводит нормально в UTF-8? Заголовки сервер продолжает выдавать про UTF-8? Строку вставили в самое начало JSP?

Автор: seth 1.10.2006, 11:23
Читает НЕ правильно

страничка
Код

<% if(request.getCharacterEncoding() == null) request.setCharacterEncoding("UTF-8"); %>
<%@ page import="beans.GetParamBean"%>
<%@ page import="org.apache.struts.util.PropertyMessageResources"%>
<%--
  Created by IntelliJ IDEA.
  User: seth
  Date: 15.09.2006
  Time: 13:29:42
  To change this template use File | Settings | File Templates.
--%>
<%@ 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" />
 <style>
    body { background: white; color: black; }
    input { width: 120px; }
</style>
<title>Test task</title>
<link type="text/css" rel="stylesheet" href="xtree.css">
<html:base/>
<script src="xtree.js"></script>
</head>
<body bgcolor=white leftmargin=0 topmargin=0 marginheight="0" marginwidth="0" onResize="if (navigator.family == 'nn4') window.location.reload()" style="font-family:Arial">
<p>
</p>
            <span>
                <script>
            if (document.getElementById) {
             var Root = new WebFXTree('Root', "javascript:go('ViewSection.do?id=0')");
            Root.setBehavior('classic');
            vart=new Array();
            <% GetParamBean pb=new GetParamBean(request.getSession().getServletContext().getRealPath(""));
            out.println(pb.getFolder(0));
            %>
            document.write(Root);
                }
                </script>
            <noscript>
           A tree for site navigation will open here if you enable JavaScript in your browser
            </noscript>
            </span>
</body>
</html:html>


заголовки:
Response Headers - http://localhost:8080/gg/treeview.jsp

Server: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Content-Length: 2297
Date: Sun, 01 Oct 2006 08:20:32 GMT

200 OK

Вывод:
Root
Õàðüêîââ
óë. Êîñìè÷åñêàÿ
äîì 12
óë. Ïåòðîâñêîãî
óë. Ñóìñêàÿ
äîì 42
äîì 43
Êèåâ
Ëüâîâ

Автор: 3x3 1.10.2006, 11:41
Цитата(seth @ 1.10.2006,  11:23)
Читает НЕ правильно

Угу.. Но ведь в самом первом посте вы писали, что с чтением в UTF-8 всё ОК. Что-то изменилось.

1. Для пущей уверенности напишите несколько русских слов прямо на страничку и сохраните её саму в UTF-8.
2. Проверьте параметры подключения к базе
3. Обрамите настройку кодировки запроса как ниже и выводите строку s где-нибудь в тексте странички:
Код

<% String s;
   if(request.getCharacterEncoding() == null){ 
      request.setCharacterEncoding("UTF-8"); 
      s="changed to UTF-8";
   }else{
      s="unchanged, was " + request.getCharacterEncoding();
   }
%>

4. Если запрос сначала обрабатывается сервлетом, а потом передаётся страничке, то кодировку запроса нужно настраивать в нём - она должна быть установлена до самого первого обращения к полям запроса.

0. И в любом случае - сперва верните нормальный вывод UTF-8. Возможно строку "<%@ page contentType="text/html; charset=UTF-8" language="java" %>" нужно тоже подвинуть поближе к началу..

Автор: seth 1.10.2006, 12:03
вот такое
Код

unchanged, was utf-8 


блин я ведь писал как все работает....

есть jsp страничка (исходник уже приводил)
из которой вызывается метод моего бина (который возвращает форматированные данные) и в этом бине идет подключение к БД

параметры подключения 

url:
jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf-8
table:
treet
user:
root
password:
1
Connector-class:
org.gjt.mm.mysql.Driver

какую еще инфу надо (только не ту что я уже писал ;) )

Автор: <Spawn> 1.10.2006, 12:10
Попробуй настроить автоматическую перекодировку - перед началом работы с MySQL выполни запрос (В случае клиентской кодировки utf-8)

Код

SET NAMES 'utf8'


Подробная информация http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

Автор: seth 1.10.2006, 12:17
Цитата(<Spawn> @ 1.10.2006,  12:10)
Попробуй настроить автоматическую перекодировку - перед началом работы с MySQL выполни запрос (В случае клиентской кодировки utf-8)

Код

SET NAMES 'utf8'


Подробная информация http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

Код

 Class.forName(class_name);
            con=DriverManager.getConnection(url, user, password);
            Statement st=con.createStatement();
            st.executeUpdate("SET NAMES 'utf8'");
            rs=st.executeQuery("select * from "+table_name+" where parentId="+id+" AND isParam='N'");
            formatted=formatChildrenJS(rs);
            rs.close();
            st.close();

сделал так - результат нулевой (т.е. ничего не изменилось smile )

Добавлено @ 12:19 
в базе выставлено:
Character Set: utf8
Collation: utf8_general_ci

Автор: <Spawn> 1.10.2006, 12:24
Цитата(seth @ 1.10.2006,  14:17)
Цитата(<Spawn> @ 1.10.2006,  12:10)
Попробуй настроить автоматическую перекодировку - перед началом работы с MySQL выполни запрос (В случае клиентской кодировки utf-8)

Код

SET NAMES 'utf8'


Подробная информация http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

Код

 Class.forName(class_name);
            con=DriverManager.getConnection(url, user, password);
            Statement st=con.createStatement();
            st.executeUpdate("SET NAMES 'utf8'");
            rs=st.executeQuery("select * from "+table_name+" where parentId="+id+" AND isParam='N'");
            formatted=formatChildrenJS(rs);
            rs.close();
            st.close();

сделал так - результат нулевой (т.е. ничего не изменилось smile )

Добавлено @ 12:19 
в базе выставлено:
Character Set: utf8
Collation: utf8_general_ci

А клиент в этом случае 1251? Тогда нужно 

Код

SET NAMES 'cp1251'


И мне думается что тут нужен не executeUpdate, а обычный execute();

П.С. У меня есть сервер на MySQL с кодировкой utf8, клиент работает в 1251 - все отлично перекодируется вышеприведенной конструкцией (правда код написан на ПХП, но сути это не меняет)

Автор: seth 1.10.2006, 12:27
Я приводил выше JSP на который это все выводится - везде прописано UTF-8 при set names cp1251 естественно выводятся вопросики...

Автор: 3x3 1.10.2006, 13:45
Цитата(seth @ 1.10.2006,  12:03)

какую еще инфу надо (только не ту что я уже писал ;) )

Статический русский текст со странички в кодировке UTF-8 отображается правильно?

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



Добавлено @ 13:49 
Цитата(<Spawn> @ 1.10.2006,  12:10)
Попробуй настроить автоматическую перекодировку - перед началом работы с MySQL выполни запрос (В случае клиентской кодировки utf-8)

Код

SET NAMES 'utf8'


Подробная информация http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

Тогда уж 
Код

SET CHARACTER SET charset_name


Но не думается, что в этом дело.

Автор: tux 1.10.2006, 16:59
Уфффф...  seth, давай окончательно разберемся с тем, что выдает MySQL в приложение. Если вот такие строки ты видишь в отладчике, то это неправильно: óë. Ïåòðîâñêîãî. Смотри как выглядит процесс. СУБД (пусть будет MySQL) хранит данные в какой-то кодировке (windows-1251, utf8 или еще чем-то). Java работает только с Unicode, то есть для того, чтобы в Java твои строки из БД выглядели правильно надо их перекодировать из кодировки, в которой они хранятся в БД и уникод. То есть если все нормально, должно все корректно перекодироваться и отобразиться в виде русских букв. Давай разберем случаи когда этого может не произойти. 

Первый вариант. Строки в базе изначально некоректные. Возможно они нормально отображаются в родных клиентах MySQL, возможно они даже нормально отображаются в клиентах, написанных на PHP, но хранятся некорректно. Вот смотри когда это может произойти. Установили для БД кодировку windows-1251, занесли какие-то данные, сделали дамп базы, потом преобразовали базу в utf8, залили дамп в базу, все русские буквы превратились в умляуты. Но коды этих умляутов соответствуют кодам русских букв, например, в windows-1251. Это я все говорю достаточно абстрактно, может все было и не так. Вообще в большинстве СУБД такой фокус не прокатил бы без видимых последствий, но MySQL есть MySQL. 

Второй вариант. Драйвер MySQL, который у тебя используется (org.gjt.mm.mysql.Driver), устарел лет надцать назад. Вполне вероятно, что он не поддерживает перекодировку для нужных тебе кодировок. Хотя в принципе в текущих драйверах это синоним актуального драйвера и возможно что более-менее свежий и используется.

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

Автор: seth 1.10.2006, 19:08
У меня первый вариант.... наконецто добрались до истины - спасибо всем
Если что еще не будет получатся я отпишусь ;)

Автор: A_titov82 9.3.2007, 18:58
Здраствуйте. Столкнулся с похожей проблемой. База в utf-8, русский текст нормально сохраняется, если его ввести из клиента mysql. А текст, введённый из веб-приложения, сохраняется в виде кракозябр... Страница тоже в кодировке utf-8. Текст, введённый из mysql-клиента, также нормально показывается на странице. Если программно сохранить текст, забитый прямо в коде, то потом всё корректно отображается. Если перед сохранением вывести сохраняемый текст на консоль, то он уже неправильно отображается. То есть "портиться" он где-то в процессе работы web-приложения (я использую struts). Либо просто неправильно считывается из формы ввода. Куда копать, подскажите...

Автор: A_titov82 9.3.2007, 20:26
проблема была решена при помощи http://forum.vingrad.ru/topic-66203/0.html#entry530693

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)