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

Поиск:

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


Опытный
**


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

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



Цитата(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" %>






--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
seth
Дата 1.10.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



как говорится - БОЛТ
все по прежнему... smile


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


Опытный
**


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

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



Цитата(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?


--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
seth
Дата 1.10.2006, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Читает НЕ правильно

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

<% 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
Êèåâ
Ëüâîâ


--------------------
PM MAIL   Вверх
3x3
Дата 1.10.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(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" %>" нужно тоже подвинуть поближе к началу..


--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
seth
Дата 1.10.2006, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вот такое
Код

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

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


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


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



Попробуй настроить автоматическую перекодировку - перед началом работы с MySQL выполни запрос (В случае клиентской кодировки utf-8)

Код

SET NAMES 'utf8'


Подробная информация тут


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
seth
Дата 1.10.2006, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Код

SET NAMES 'utf8'


Подробная информация тут

Код

 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

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


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


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



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

Код

SET NAMES 'utf8'


Подробная информация тут

Код

 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 - все отлично перекодируется вышеприведенной конструкцией (правда код написан на ПХП, но сути это не меняет)


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
seth
Дата 1.10.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


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


Опытный
**


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

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



Цитата(seth @ 1.10.2006,  12:03)

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

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

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



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

Код

SET NAMES 'utf8'


Подробная информация тут

Тогда уж 
Код

SET CHARACTER SET charset_name


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

Это сообщение отредактировал(а) 3x3 - 1.10.2006, 13:50


--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
tux
Дата 1.10.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


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

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



Уфффф...  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 и напиши махонькое приложение, которое будет выполнять один селект из той таблицы, из которой у тебя и вываливаются все эти кракозябры и запиши их в файл в виндовой кодировке (насколько я понимаю в виндовой консоли ты опять-таки увидишь кракозябры, хотя может и нет, уж не помню). Потом посмотри этот файлик, есди там все в порядке, то причина как минимум не в том, как данные хранятся в базе. Потом попробуй подставить тот драйвер, который ты сейчас используешь. Возможно причина в нем. Ну и если все нормально, то остается разбираться с вебом, хотя тебе здесь столько написали, что не думаю что есть варианты причин, по которых что-то может работать некорректно.

Это сообщение отредактировал(а) tux - 1.10.2006, 17:00
PM MAIL Skype GTalk Jabber YIM   Вверх
seth
Дата 1.10.2006, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


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


Новичок



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

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



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


Новичок



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

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



проблема была решена при помощи создания фильтра 
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.1042 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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