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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> И снова JSP и русские буквы 
:(
    Опции темы
spbnvb
Дата 15.6.2008, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



И снова Jsp и русские буквы 

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

Проблема была такая. Читались неправильно русские тексты из параметров запроса. Если возвращать в чистом виде то, что было введено в поля форм, то получалось на выходе только знаки вопроса, то есть нераспознанные коды символов в текущей кодировке. У меня "Cp1251", она же windows-1251.

Для сервлетов решил это с помощью фильтра, который выполнялся первым и выполнял команду "request.setCharacterEncoding ("Cp1251")". естественно, для форм типа enctype="multipart/form-data" это выкидывало исключение, поэтому пришлось заключить команду в блок try/catch. 

Для сервлетов метод прошел, но у jsp видать свои соображения (разная внутренняя реализация интерфейсов), и знаки вопроса никуда не делись.
Причем вот интересно, у меня локально на винде всё отлично, проблема поднимается только, когда приложение переносится на линукс сервер.

решил я эту проблему криво, написал функцию, через которую проходят все переменные, в которые читаются данные из формы. Когда то делал её для вебмайла, чтобы разрешать проблемы, когда неправильно составлены заголовки письма, но тут пригодилось.

Код


public static String decodeBadHeader(String sourse, String realEncoding)
 {      String decText = "";
      try {
        byte[] b = sourse.getBytes("ISO8859_1");
        //3) Если плохой заголовок и указано на невозможность
        //перекодирования, тогда получаем биты ISO,
        //затем перекодируем в текущий charset
        String javaCharset = "KOI8_R";
        if (realEncoding != null) {
          javaCharset = MimeUtility.javaCharset(realEncoding);
          if (javaCharset == null) {
            javaCharset = "KOI8_R";
          }
        }
 //Если charset получить не удалось, перекодируем в стандарт де-факто для
        //маил писем - KOI8_R, хотя это не дает 100% гарантии успешной перекодировке
        //в случае, если charset действительно не указан.
        else {
          javaCharset = "KOI8_R";
        }
        decText = new String(b, javaCharset);
      }
      catch (UnsupportedEncodingException ex) {      }
        return decText;    }




Так вот всё бы хорошо, но у этой функции один недостаток. Если на сервере нормально распознаются параметры русские, тогда эта функция наоборот всё портит. То есть на "плохом" сервере позволяет решить проблему, а на "Хорошем" приходится переписывать код и комментировать её. Это очень неудобно, согласитесь. 
Так вот ВОПРОС НАКОНЕЦ ТО: Возможно ли, имея строку, определить, является ли она "правильной" строкой Cp1251, или всё таки это ISO, или в идеале вообще определить кодировку строки. Тогда вообще можно было бы написать класс, который вместо request.setCharacterEncoding("Cp1251"), которая там работает, а здесь уже нет, позволил бы решить эту проблему более глобально.

Конечно есть ещё вариант, что я тут туфту понасочинял, а есть более нормальные способы решения проблемы. Тоже рад буду услышать)
PM MAIL WWW   Вверх
necromancer
Дата 16.6.2008, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



2 аспекта:
1. кодированием параметров занимается веб браузер. Если он не в курсе что у тебя за кодовая страница он будет кодировать в ISOчто то там
для решения служит установка в JSP фалага
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
а так же установка тэга:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

в ствоем случае utf-8 заменить на cp1251(windows-1251)

2. наличие или понимание кодировки самим сервером. для этого он наверное должен поддерживтаь русскую кодировку (хотя помоему это не так важно как п.1)

ну и PS =) разве сложно определить какой это запрос? multipart/form-data или нет и не городить try catch там где это не нужно? ;-)


--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0631 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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