Прежде всего: извините за мой английский.И после этого ...
У меня есть сервер 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&useEncoding=true&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" >
Результаты одинаковы.
Большое спасибо!