| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Кодировка. Сервлет. Unix. Проблемма. |
| Автор: Lubomyr 3.10.2005, 14:50 |
| Сервлет получает Post с формы (кирилицу) и перекодирует его непонятным образом. То есть если выводить ето значение - получается непонятный набор непонятных символов. Под Windows все работает коректно! При чем данные из базы, кирилица закодированная в сервлете выводятся коректно всегда. Кодировка везде UTF-8; Сервер JBOSS 3.2.1. В самом начале всегда стоит request.setCharacterEncoding("UTF-8"); Когда надо выводить ставлю - response.setContentType("text/html; charset=UTF-8"); <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" .... тоже везде; Даже уже ACCEPTCHARSET="utf-8" везде в формах поставил... Понимаю, что проблемма может быть в региональных настройках или настройках ОС (Free BSD). Нельзя ли сделать код независимым от этих настроек? И что вообще надо исправить? Буду признателен за ответ. |
| Автор: tux 4.10.2005, 13:41 | ||||||
Насколько я понимаю кодировка выставляется уже в сервлете. Попробуй выставлять ее в фильтре. Класс фильтра примерно такой:
В web.xml нужно добавить следующее:
|
| Автор: Lubomyr 10.10.2005, 15:45 |
| Спасибо. Сделал так. Все равно данные которые получены методом Get request.getParameter считывает в кодировке ISP-8859-1, а приходят они в правильной, UTF-8. То есть строку в пинципе можно получить, используя: String newString = new String(badString.getBytes("ISO-8859-1"), "UTF-8"); Но это не универсальный подход... Под другой платформой может не сработать... Post работает нормально. |
| Автор: seth 1.10.2006, 20:06 | ||
Прописал фильтр - а он выдает ошибку - не могу понять почему (используется struts)
|
| Автор: 3x3 1.10.2006, 23:43 | ||||
http://forum.vingrad.ru/index.php?showtopic=113274&st=30 читай. Jsp должно начинаться заклинанием:
Не принудительным выставление кодировки, заметь, а только если она не выставлена. С сервлетом так же: Для начала любой деятельности - настроить кодировку реквеста и респонса. Это всё. |
| Автор: UnicornMirage 2.10.2006, 08:48 | ||||
нужно запустить JBoss или какой там у тебя сервер - с параметром
и UTF не будет нужен |
| Автор: UnicornMirage 2.10.2006, 10:57 | ||||
| просто ты сказал что работаешь с кириллицей - зачем тогда юникод - лишняя трата трафика? установка этого параметра не влияет на реквесты/респонсы - т.к. там они задаются как было сказано выше. а вот этот параметр указывает виртуальной машине кодировку по-умолчанию, не зависимо от настроек ОС. и поэтому если ты напишешь
то у тебя данные в строке будут в той кодировке, которая была в -Dfile.encoding=windows-1251 а у автора темы было жестко привязано в коде:
|
| Автор: ishi 3.10.2006, 23:49 | ||
Здравствуйте! Наконец нашел время ответить. Значит, дело обстоит так: 0)Хватит флудить о том, чего не знаете, хотя в спорах рождается истина, но вы уже задолбали человека. 1).Дело в том, что платформа тут ни при чем. Фирме sun давно известно о проблемах с интернациональными кодировками в сервлетах. Они разработали специальный пакет National Servlets, Который решает эту проблему. Класс простенький и не требует переписания всего кода сервлета. 2) Второй вопрос, это то , что tomcat довольно примитивно определяет кодировку запроса, поэтому не удивительно, что в большинстве случаев это null или ничего не значащий "url-encoding". Советую почитать, если для вас это важно, эту статью "http://ishi.dev.juga.ru/servlet/site?tar=gt&theme=106", причем обратите внимание, что сайт, на который вы зайдете сидит на линуксе, полностью построен на сервлетах + MySQL, так что это живой пример решения вашей проблемы. 3) Третий вопрос - это MySQL драйвер может корежить кодировки при получении из базы строковых данных. Здесь я тоже могу подкинуть один класс, который решает эту проблему. Но если Ваш сайт используется в коммерческих целях, то класс будет платный. |
| Автор: tux 4.10.2006, 02:12 | ||||||||
National Servlets - это вот это - http://servlets.chat.ru/? О, великий гуру, простите за глупость, но при чем же здесь Sun?
Tomcat определяет кодировку запроса в соответствии со спецификацией, не больше не меньше. Существует набор давно выработанных практик, которые позволяют избавится от каких-либо проблем с кодировками. Часть из них описаны в этой теме. Кстати, хостинг, насколько я понимаю, не ваш. Как же вы утверждаете, что это живой пример если даже веб-контейнер настроили за вас?
Пардон, еще раз извиняюсь. А где выше в теме было про MySQL? Оффтоп, однако. Кстати, насчет коммерции. Если вы будете руки использовать в коммерческих целях, могу предложить дрова по сходной цене.
Знаете, здесь без вас есть кому решать где флуд, а где нет. Минус за неуважение к сообществу форума. |
| Автор: 3x3 4.10.2006, 02:40 | ||||
Приложение-то, насколько я понял, его. |
| Автор: tux 4.10.2006, 02:45 |
Думаю да. На juga.ru используется Resin, там кажется можно дефолтные кодировки request и response установить в настройках сервера, поэтому с русскими буквами проблем быть не должно. Хотя могу и ошибаться, надо глянуть. |
| Автор: 3x3 4.10.2006, 02:49 | ||
Да, на нём: http://forum.juga.ru/showthread.php?threadid=295 ____ По крайней мере своей рекламой он пропиарил хостинг |
| Автор: ishi 4.10.2006, 21:32 |
| Да ребята, не пойму, к чему вообще тогда велась беседа. National Servlets - это пакет от sun? а не чат. Вы плохо искали . Я приложу его в файле. Во вторых на juga.ru сидит сайт - пример, в разработке которого я принимал участие. Это ishi.dev.juga.ru. что касается всяких там дефолтов, то этот сайт сделан как пример работы независимо от настроек. Что касается коммерции, то надо уважать чужой труд. И если мои друзья потрудились разработать класс, который позволяет работать на любом хосте незадумываясь о настройках, а кто то использует его, чтобы бабулетов заработать, то я сам приверженец того, чтобы делиться с теми, кто мне помогает. Так что имею полное право предупреждать о коммерческом использовании. Касательно того как tomcat определяет кодировку запроса, то я смотрел в коде САМОГО и ничего примитивнее ещё не видел в этом смысле, будь это хоть трижды спецификация. Так что если человеку нужна помощь, я предложил действенный совет. Попробуйте и увидите. ..... А как файл присоединить. ... В общем не найду такой кнопки здесь. Если найду ссылку на sun-овском сайте, вернее вспомню, то пришлю. Хотя можете сами поискать. И juga.ru просто показал вам пример, как работает то , о чем я говорю. Вживую. Кстати, у них сегодня с сервером проблемы. Причам часто такое. Так что пиарить там нечего. Ну прчему вы болтаете как вам хочется, а мне так сразу минус. Может я так разговариваю. Ладно, всем удачи. Надеюсь, чем то помог. |
| Автор: ishi 4.10.2006, 21:52 | ||||
Вы привели эту ссылку http://forum.juga.ru/showthread.php?threadid=295 по поводу Resin. Это что шутка такая? У меня дома стоит FreeDSD 4 без русского языка вообще, без иксов. Только jdk1.4, jre 5, apache 3 с чем то и 5-й tomcat. на виртуальной машине работает, как отдельный компьютер. На tomcat сидит такой же мой сайт, как я вам приводил в примере. Так вот, я обращаюсь к нему из винды и с русскими буквами проблем тоже нет, хотя я там ничего вообще не настраивал дополнительно, лень просто. Всё по умолчанию. |
| Автор: y3u 4.10.2006, 22:25 |
мне вот тоже стало интересно ishi.dev.juga.ru - упал, там сломалсо сервлетег, точнее там тупо налл поинтер эксцепшон в древнем при древнем Oracle's XSQL Servlet Кстати, не понятно, каким образом я смогу получить информацию о том как там в примере все работает, не имея его исходников? вобсчем, что-то вы темните, гражданин |
| Автор: sandello 5.10.2006, 07:56 | ||
Коллега на работе написал кратенькую инструкцию для борьбы с кодировкой в томкате:
|
| Автор: 3x3 5.10.2006, 12:59 | ||||
... если её Томкат не определил сам. ________ Во всех этих решения с юникодом, кстати, мне видится одна маленькая проблемка. Похоже борьба с кодировками на входе - это ерунда по сравнению с кодировками на выходе. Вдруг придет такой HTTP-клиент, который тупо понимает только Windows-1251 и никаких юникодов не акцептит? Что будет в этом случае? Станет контейнер перекодировать UTF-8 своих сервлетов в кодировку клиента или будет тупо гнать ему юникод, четко зная, из Accept-chaset, что клиент этого не понимает? |