Кодирование ада с помощью Spring, Hibernate и MySQL - PullRequest
0 голосов
/ 03 июня 2019

У меня проблема с кодировкой, которая сводит меня с ума. Моя сеть поддерживает как английский, так и испанский языки. Некоторые из моих таблиц (сгенерированных hibernate) имеют в качестве параметров сортировки utf8_general_ci, некоторые другие, и я не знаю почему, имеют latin1_swedish_ci. Но меня трясет то, что когда люди используют мою форму контактов и помещают в нее, например, слово с «-», мой Spring Controller берет его и отправляет мне электронное письмо, которое в порядке (я имею в виду, что оно имеет -), прежде чем сохранить данные по MySQL. Но когда я проверяю, что сохранено в MySQL (а в моей таблице контактов есть сопоставление utf8_general_ci), внутри появляются какие-то ужасные символы, заменяющие символ «ñ», например Альваро Нежес Кабеса де Вана. Продолжая, на страницах jsp объявлен UTF-8, таблица - utf8_general_ci, hbn - также объявлен utf-8:

# hibernate props
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show.sql=true
hibernate.hbm2ddl.auto=update
hibernate.format_sql=true
# hibernate props added to fix 4bytes encoded characters
hibernate.connection.CharSet=utf8mb4
hibernate.connection.characterEncoding=utf8
hibernate.connection.useUnicode=true

Но все вместе работает не так, как ожидалось.

Любая помощь будет приветствоваться.

РЕШЕНИЕ: по крайней мере для меня единственным исправлением было добавить фильтр в мой файл web.xml. Я почти уверен, что есть более эффективные способы решения проблем кодирования более элегантным способом, но в моем случае все было настроено для использования UTF-8, и парто моих форм работает хорошо, но другие показывают, что Альвар Нуньес Кабеса де Вака - Альвар Нежен Кабеса де Вака. Фильтр:

<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 MVC UTF-8 Кодировка

1 Ответ

0 голосов
/ 03 июня 2019

Похоже, что может быть несколько проблем.Итак, планируйте сделать несколько исправлений.

  • Используйте UTF-8 повсюду.(Latin1 будет работать для английского + испанского, но индустрия уходит от этого.)
  • Старые версии MySQL по умолчанию имеют набор символов latin1 (и сопоставление latin1_swedish_ci).
  • Используйте CHARACTER SET utf8mb4 (не utf8) для MySQL.Это эквивалентно UTF-8 во внешнем мире.В этом фрагменте конфигурации измените characterEncoding=utf8 на characterEncoding=UTF-8.
  • Вы упомянули utf8_general_ci - измените на utf8mb4... и рассмотрите utf8mb4_unicode_520_ci (лучше всего) или utf8mb4_spanish_ci или utf8mb4_spanish2_ci.
  • Núñez - это моджибаке для Núñez.Это происходит, когда часть системы говорит по-латински, а другая часть говорит UTF-8.
  • Если вам нужно восстановить испорченные данные (из-за Мохибаке), мы можем обсудить это.Предпочтительнее начинать все сначала, используя UTF-8 / utf8mb4.

Подробнее о диагностике моджибаке и т. Д .: Проблемы с символами UTF-8;то, что я вижу, не то, что я сохранил

Для различий сортировки: http://mysql.rjweb.org/utf8_collations.html - в основном относится к ch, ll, ñ - Вы хотите терассматриваться как «отдельные буквы»?(Должен ch сортироваться между cg и ci или после cz? И т. Д.)

Для Java / JDBC / Hibernate / и т. Д .: ?useUnicode=true&characterEncoding=UTF-8

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