| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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"); не хочет... кто что посоветует?? |
| Автор: Nobody 24.9.2006, 17:56 |
| Посоветую выкинуть 1251 и делать всё в юникоде. |
| Автор: Tony 24.9.2006, 21:03 | ||
Согласен.Пиши всё в UTF-8. |
| Автор: seth 26.9.2006, 18:39 | ||||
хммм - на UTF-8 ничего не получилось - написал на 1251 (т.к. БД в 1251) |
| Автор: tux 27.9.2006, 02:01 | ||
А какая связь между БД в 1251 и веб-страницей в 1251? |
| Автор: Maksym 27.9.2006, 10:24 |
| seth Что имеется в виду под "ничего не получилось"? где именно сбоит кодировка? |
| Автор: seth 27.9.2006, 20:27 | ||||
|
| Автор: Maksym 28.9.2006, 12:19 |
| Вот такое дело где-нибудь присутствует: request.setCharacterEncoding("UTF-8"); ? |
| Автор: seth 28.9.2006, 23:10 | ||
пробовал - не помогает... проблема решилась с установкой кодировки в windows-1251 |
| Автор: Maksym 29.9.2006, 18:59 | ||
| Stampede Великолепный ответ, аплодирую!
По этому поводу, tux дал готовый рецепт http://forum.vingrad.ru/index.php?showtopic=94717. |
| Автор: seth 30.9.2006, 13:14 | ||
| Спасибо за ответ - к сожалению ничего конкретного добавить не могу - необходимо было перенастраивать систему ну могу кое что добавить - таблицу в mysqle сделал на utf-8 На страничке такое:
при дебаге в бин приходит такое: Õàðüêîâ т.е. вроде UTF-8 и все правильно - только на страничке отображается точно также (т.е. крокозябры) |
| Автор: tux 30.9.2006, 13:35 | ||
| seth, вот это: совсем не то, что должно быть, должны быть обычные русские буквы. Как ты выполняешь подключение к MySQL? У тебя в url подключения есть параметры useUnicode и characterEncoding? Строка подключения должны выглядеть примерно так:
|
| Автор: Stampede 30.9.2006, 13:36 |
Вот это, кстати, выглядит обнадеживающе (я могу даже сказать, что там написано что-то про твой город И по прежнему нет ответа на жизненно важный вопрос: какие заголовки HTTP приходят со страницей. |
| Автор: seth 30.9.2006, 19:16 | ||||||
прописал это в подключении - ничего не изменилось вотъ бин
строка подключения: 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 | ||
Да, эти. Теперь убедись, что "Content-Type: text/html;charset=UTF-8" присутствует и на той странице, на которой ты просматриваешь результаты, и на той, откуда засылаешь POST. Если все в порядке, то следующее, на что будем смотреть, это кодировка входящего запроса. Например, на странице JSP можно написать так:
|
| Автор: seth 30.9.2006, 23:46 | ||||||
Давайте для начала разберемся с выборкой из БД Заголовок jsp на который выводятся данные я уже приводил
бин тоже показывал <%=request.getCharacterEncoding()%> выдает null |
| Автор: 3x3 1.10.2006, 00:27 |
| А как вы передаёте сервлету строку для вставки? В URL? |
| Автор: seth 1.10.2006, 00:29 | ||
использую struts |
| Автор: 3x3 1.10.2006, 00:35 | ||||
Откуда берётся строка - из браузера? |
| Автор: seth 1.10.2006, 00:44 | ||||||
давайте для начала разберемся с выборкой из БД... |
| Автор: Stampede 1.10.2006, 01:01 |
| Да, вот еще какую полезную вещь можно сделать: поменяй в форме method="post" на method="get", и тогда в адресной строке браузера адрес целевой страницы в части после знака вопроса будет содержать закодированную кириллическую строку. Любопытно было бы взглянуть, что она из себя представляет. А что касается базы, то у меня нет сомнений, что там все кодируется нормально. Судя по симптомам, непонятности у тебя именно в вебном слое. |
| Автор: 3x3 1.10.2006, 01:02 | ||||||||||
Она же у вас читается нормально в режиме UTF-8? Или я вас неправильно понял? Добавлено @ 01:10
Он вроде не писал ничего про форму. При таких хидерах как выше и гетом буквы пойдут в форме %uXXXX. Поэтому сначала надо разобраться откуда вообще приходит строка в неправильной кодировке. |
| Автор: Stampede 1.10.2006, 01:22 | ||
А вот в этом я как-раз и не уверен. Должны - да. Но судя по тому, что seth упоминал ранее, есть сильное подозрение, что приходит уже в 1251. Вот цитата:
Поэтому я и говорю, хотелось бы увидеть запрос браузера в чистом виде. |
| Автор: 3x3 1.10.2006, 01:54 | ||||
Хм.. Воспроизвел проблему. Именно постом оно и кривляется если кодировку в браузере скидываешь на 1251 принудительно.. Добавлено @ 01:56 еУМЙ РТЙОХДЙФЕМШОП УФБЧЙФШ ОЕРТБЧЙМШОХА ЛПДЙТПЧЛХ, ФП НПЦОП РЕТЕДБФШ УЕТЧЕТХ ОЕРТБЧЙМШОЩЕ ВХЛЧЩ |
| Автор: Stampede 1.10.2006, 02:47 | ||
Шпион Смит, вас разоблачили |
| Автор: 3x3 1.10.2006, 02:57 | ||
______ Вобщем воркэраунд для случая seth таков: В самом начале обработки, до любых обращений к свойствам реквеста, приложение должно сообщить реквесту, в какой кодировке он получил запрос для приложения. В случае JSP-шки это означает, что её первая строка должна выглядеть так:
PS Я потрясён этим обстоятельством... Сервер недопонимает в какой кодировке ему пришли данные POSTом. |
| Автор: Stampede 1.10.2006, 03:27 | ||
Я тоже маленько потрясен. Только не сервером, а браузером. Тем, что он не сообщает, в какой кодировке он шлет данные запроса. А еще JSP. Не знаю, как в других контейнерах, но у меня в Jetty выражение <%@ page contentType="text/html;charset=KOI8-R" %> не приводит к выставлению заголовков ответа HTTP! Вот так вот, век живи - век учись ЗЫ. Да, и мы еще не знаем, какую роль во всем этом играет Struts, который, как выяснилось, тоже здесь фигурирует |
| Автор: seth 1.10.2006, 10:39 |
| Уххххх - понаписывали Я ведь чуть позже писал что перевел базу на UTF-8..... и теперь не могу прочитать оттуда - с записью в БД даже не хочу еще разбиратся пока не будет нормально выводится.... поскольку Mysql 5 то судя по всему просто мой коннектор не поддерживает такое различие кодировок - либо надо качать новый коннектор (что проблематично) либо ставить старый mysql с которым все ок.... или мне еще тут чего-нить посоветуют.... |
| Автор: 3x3 1.10.2006, 10:52 | ||||||||
Не трогай базу. Работай в юникоде, как было, а что бы строки в нормальной кодировке были, просто пропиши в начале JSP-страниц:
Или в начале кода, отрабатывающего респонс:
Это всё. Всё остальное - как в начале прописывал, укажи для UTF-8:
|
| Автор: seth 1.10.2006, 11:02 |
| как говорится - БОЛТ все по прежнему... |
| Автор: 3x3 1.10.2006, 11:12 | ||||||||||||
Ну браузер-то шлет.. Иногда в не правильном представлении, отчего, видимо, принципиальные JAVA-программеры и игнорируют такие заголовки. Но опять же есть воркэроунд: Вон что люди советуют, чтобы не зависеть от противного браузера: добавлять в форму поле
И туда браузер (иногда?) при посте складывать данные о кодировке POSTа. Можно использовать для проверки - что там себе пользователь установил, только как потом осуществить указание реквесту его кодировки, ведь она должна быть задана ДО чтения значений формы Ну и опять же ASP, PHP как-то отрабатывают такую ситуацию без выкрутасов.
Под Tomcat отработало правильно. Может у вас в джава-машине не установлена такая локаль? Я бы начал с того, что попробовал бы поперекодировать строки в/из KOI8-R, если станет генерировать исключения - значит оно.
Struts тут ни при чем. Добавлено @ 11:16
Сейчас читает из базы нормально в UTF-8? В браузер выводит нормально в UTF-8? Заголовки сервер продолжает выдавать про UTF-8? Строку вставили в самое начало JSP? |
| Автор: seth 1.10.2006, 11:23 | ||
| Читает НЕ правильно страничка
заголовки: 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 | ||||
Угу.. Но ведь в самом первом посте вы писали, что с чтением в UTF-8 всё ОК. Что-то изменилось. 1. Для пущей уверенности напишите несколько русских слов прямо на страничку и сохраните её саму в UTF-8. 2. Проверьте параметры подключения к базе 3. Обрамите настройку кодировки запроса как ниже и выводите строку s где-нибудь в тексте странички:
4. Если запрос сначала обрабатывается сервлетом, а потом передаётся страничке, то кодировку запроса нужно настраивать в нём - она должна быть установлена до самого первого обращения к полям запроса. 0. И в любом случае - сперва верните нормальный вывод UTF-8. Возможно строку "<%@ page contentType="text/html; charset=UTF-8" language="java" %>" нужно тоже подвинуть поближе к началу.. |
| Автор: seth 1.10.2006, 12:03 | ||
вот такое
блин я ведь писал как все работает.... есть 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)
Подробная информация http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html |
| Автор: seth 1.10.2006, 12:17 | ||||||
сделал так - результат нулевой (т.е. ничего не изменилось Добавлено @ 12:19 в базе выставлено: Character Set: utf8 Collation: utf8_general_ci |
| Автор: <Spawn> 1.10.2006, 12:24 | ||||||||||
А клиент в этом случае 1251? Тогда нужно
И мне думается что тут нужен не executeUpdate, а обычный execute(); П.С. У меня есть сервер на MySQL с кодировкой utf8, клиент работает в 1251 - все отлично перекодируется вышеприведенной конструкцией (правда код написан на ПХП, но сути это не меняет) |
| Автор: seth 1.10.2006, 12:27 |
| Я приводил выше JSP на который это все выводится - везде прописано UTF-8 при set names cp1251 естественно выводятся вопросики... |
| Автор: 3x3 1.10.2006, 13:45 | ||||||||
Статический русский текст со странички в кодировке UTF-8 отображается правильно? В этом нужно определиться в первую очередь, что бы отсечь вариант граблей с кодировкой на клиенте. Добавлено @ 13:49
Тогда уж
Но не думается, что в этом дело. |
| Автор: 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 |