2010-09-23 2 views
0

У меня есть база данных mysql с текстовыми строками unicode. Мое приложение JSF (работает на tomcat 6) может считывать эти строки unicode и правильно отображать их в браузере. Все html-кодировки установлены в UTF-8.Символы Unicode сохраняются некорректно

Когда я сохраняю свой объект, даже не внеся никаких изменений, Hibernate сохраняет его обратно в базу данных. Если я сейчас смотрю прямо в базе данных, я вижу, что персонажи с акцентами стали мусорными.

Моя строка подключения к базе данных:

 <property name="hibernate.connection.url" 
        value="jdbc:mysql://database.address.com/dbname?autoReconnect=true&#38;zeroDateTimeBehavior=convertToNull&#38;useUnicode=true&#38;characterEncoding=utf8"/> 

Изменение этой characterEncoding в UTF-8 вместо utf8 не имеет никакого значения.

На самом деле это были рабочие дни назад точно, но теперь это не так, и у меня нет идей для проверки. Есть ли у вас какие-либо предложения? Я могу предоставить любую дополнительную информацию, которая считается соответствующей.

ответ

1

Некоторые варианты разрешения, которые приходят на ум:

  • при использовании Facelets, указать <?xml version="1.0" encoding="UTF-8"?> в верхней части страницы
  • при использовании JSP, укажите <%@ page pageEncoding="utf-8" %>
  • если это делает не работает, создайте фильтр, который отображается на сервлет сервлетов, и делает request.setCharacterEncoding("utf-8")
0

У меня была такая же проблема, как у вас, но с 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> 
+1

Снимите 'res.setContentType()', он только делает более плохо, чем хорошо. 'Req.setCharacterEncoding()' уже предложен Божо. Более подробную информацию и решения см. Также в [этой статье] (http://balusc.blogspot.com/2009/05/unicode-how-to-get-characters-right.html). – BalusC

0

В 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> 
+1

В основном это просто 'request.setCharacterEncoding (« UTF-8 »)', не более того. – BalusC

0

Убедитесь, 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>