У меня есть база данных mysql с текстовыми строками unicode. Мое приложение JSF (работает на tomcat 6) может считывать эти строки unicode и правильно отображать их в браузере. Все html-кодировки установлены в UTF-8.
Когда я сохраняю свой объект, даже не внося никаких изменений, Hibernate сохраняет его обратно в базу данных. Если я сейчас смотрю прямо в базе данных, я вижу, что персонажи с акцентами стали мусором.
Моя строка подключения к базе данных:
<property name="hibernate.connection.url"
value="jdbc:mysql://database.address.com/dbname?autoReconnect=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8"/>
Изменение этого символаEncoding на UTF-8 вместо utf8 не имеет значения.
На самом деле это были рабочие дни назад точно, но теперь это не так, и у меня нет идей, что проверить. Есть ли у вас какие-либо предложения? Я могу предоставить любую дополнительную информацию, которая считается необходимой.
Некоторые варианты решения, которые приходят мне на ум:
<?xml version="1.0" encoding="UTF-8"?>
в верхней части страницы<%@ page pageEncoding="utf-8" %>
request.setCharacterEncoding("utf-8")
Это происходит только на определенных таблицах? Возможно, DEFAULT CHARSET из этих таблиц отличается от остальных. (http://dev.mysql.com/doc/refman/5.1/en/charset-table.html)
Обеспечьте кодированные страницы UTF-8, чтобы отображались определенные символы и отправлены правильно...
Добавьте этот фильтр в web.xml.
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
В Spring простейшее решение, которое я нашел, CharacterEncodingFilter.
<filter>
<filter-name>encoding-filter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding-filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
У меня была такая же проблема, как у вас, но с PostgreSQL. Вы можете использовать фильтр, как показано ниже. Это сработало для меня. Я думаю, что это должно быть лучшим решением для этого, но я еще не нашел:/
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class UnicodeFilter implements Filter {
@Override
public void destroy() {}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
// Set the characterencoding for the request and response streams.
req.setCharacterEncoding("UTF-8");
res.setContentType("text/html; charset=UTF-8");
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig arg0) throws ServletException {}
}
В web.xml:
<filter>
<filter-name>utffilter</filter-name>
<filter-class>utils.UnicodeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>utffilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
res.setContentType()
, это будет только хуже, чем пользой. req.setCharacterEncoding()
уже предложен Божо. Для более подробной информации и решений см. Также эту статью .
request.setCharacterEncoding("UTF-8")
, ничего более.