Символы Юникода сохраняются неправильно

0

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

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

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

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

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

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

Теги:
hibernate
jsf
jdbc
unicode

5 ответов

1

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

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

Это происходит только на определенных таблицах? Возможно, DEFAULT CHARSET из этих таблиц отличается от остальных. (http://dev.mysql.com/doc/refman/5.1/en/charset-table.html)

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>
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") , ничего более.
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() уже предложен Божо. Для более подробной информации и решений см. Также эту статью .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню