JDBC Resource Pool с Tomcat6 для проблем Centos5.5 и utf8 - PullRequest
0 голосов
/ 29 января 2011

Прежде всего: извините за мой английский.И после этого ...

У меня есть сервер Tomcat6 на Centos5.5 с настроенным пулом ресурсов JDBC.

<Resource name="jdbc/BD"
            auth="Container"
            type="javax.sql.DataSource"
            username="user"
            password="pass"
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://127.0.0.1:3306/BD?autoReconnect=true&amp;useEncoding=true&amp;characterEncoding=UTF-8"
            maxActive="30"
            maxIdle="50"
            maxWait="-1"
            testWhileIdle="true"
            timeBetweenEvictionRunsMillis="300000"
/>

И я кодировал класс для установления соединенияк этому источнику данных (с именем DAO);

        Context initCtx = new InitialContext();
        Context envCtx = (Context) initCtx.lookup("java:comp/env");
        DataSource ds = (DataSource) envCtx.lookup("jdbc/BD");
        connexio = ds.getConnection();
        sentencia = connexio.createStatement();

И здесь у вас есть код, который я использую для выдачи запросов:

            DAO conn = new DAO();
            ResultSet SQLresults = conn.executeSQL(SQLQuery);

            while (SQLresults.next()) {
                String string1 = SQLresults.getString(2);
                String string2 = SQLresults.getString(3);
                String string2 = SQLresults.getString(4).replaceAll("[\n\r]", " ");
                String string3 = SQLresults.getString(5).replaceAll("[\n\r]", " ");
                String string4 = SQLresults.getString(6).replaceAll("[\n\r]", " ");
            }

Мой DDBB (MySQL) имеет UTF8 попо умолчанию, и я создал все свои таблицы с "default charset = utf8", чтобы быть уверенным в этом.

И ....

Я получаю почти все с правильно сформированной кодировкой символов UTF8, но иногда у меня есть ошибки с некоторыми символами.Я уверен, что проблема между mysql и tomcat (так в моих сервлетах или в соединении JDBC), потому что я вижу некоторые неправильно сформированные символы после того, как сервлет записывает их, но они хорошо сформированы в приглашении MySQL UTF8 вмой терминал.

Например, в терминале MySQL UTF8 (Putty, терминал iMac, Ubuntu и терминал Debian) я вижу, что:

LG Optimus 2X и Optimus Black по цене €499 от Amazon Германия, пока недоступна для покупки

, но мой сервлет напишет, что:

LG Optimus 2X и Optimus Black по цене 499 евро от Amazon Germany,пока недоступно для покупки

И "â? ¬" должно быть "€", когда я его декодирую ... но это не так.Это плохо сформировано.

Другие примеры символов в моих терминалах UTF8:

Дэвид Труба: «Leer novelas me llevó al guión»: Tweet RUBB DAR DO ÁLVARE ...

Сервлеты:

Дэвид Травба: «Прочитать новеллы мне милые?»: Чирикать Рубин Даро ...

Но "â ??", "â?", "Ã?"должно быть «» É (после их декодирования), но они повреждены в UTF8-символах, и я не знаю почему, потому что 85% UTF8-символов прекрасно декодируются.Вы можете увидеть это с помощью: ó Í Á, потому что они полностью сформированы.

Что вы думаете об этом ?.Если это помогает, я отправляю этот текст UTF8 на устройства Android, и когда я вижу плохо сформированный символ UTF8, я вижу.

Кстати, я использую эту страницу, чтобы быть уверенным в хорошем тексте UTF8:

http://www.cafewebmaster.com/online_tools/utf_decode

И ... это подтверждает правильность и плохую формуchars.

Ах !, а сервлеты пишут текст в браузере (без html-операторов, только текст), но я проводил некоторые тесты, и если я преобразовал его в html-страницу и поместил плохойсформированные данные в теле и заставить их быть utf8 с:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >

Результаты одинаковы.

Большое спасибо!

1 Ответ

0 голосов
/ 29 января 2011

Я вижу как минимум две (потенциальные) проблемы.Во-первых, в своем URL JDBC вы использовали параметр useEncoding, хотя он официально не распознается драйвером JDBC MySQL.Он должен был называться useUnicode.

Тогда ответная часть сервлета.По умолчанию используется кодировка символов по умолчанию платформы, которая сама по себе не является UTF-8.Вам необходимо явно установить кодировку символов ответа сервлета в UTF-8, а также до того, как вы напишите в него любой символ.Поскольку вы не используете JSP, вам также необходимо вручную установить тип содержимого.

resposne.setContentType("text/plain; charset=UTF-8");
resposne.setCharacterEncoding("UTF-8");

Сделайте это до первого вызова getWriter() или getOutputStream().

См. Также:


Следует отметить, что метатегкак указано в вашем вопросе игнорируется , когда содержимое передается по HTTP.Вместо этого HTTP-заголовок ответа Content-Type будет использоваться для определения типа содержимого и кодировки символов.Заголовок HTTP можно определить, например, с помощью Firebug на панели Net .

alt text

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...