Emoji рендерится в столбце таблицы MySQL и в HTML после ajax, но НЕ рендерится после перезагрузки страницы.Зачем? - PullRequest
0 голосов
/ 09 октября 2018

Я реализовал смайлик для комментариев в своем веб-приложении / блоге Spring & Thymeleaf.

В настоящее время я могу выбрать смайлик, увидеть его в текстовой области, отправить форму, комментарийсохраненный в методе контроллера post в моей таблице базы данных MySQL 5.7.17 - я вижу смайлик в столбце таблицы - комментарий возвращается через ajax, и я вижу смайлики на странице.Ууууууу!

Но!После того, как я перезагружаю страницу ... я вижу это:

"ð ± и ð¶"

Что дает ??

Чтобы вставить смайлики в mysql, я следовал этому уроку:

https://mathiasbynens.be/notes/mysql-utf8mb4

Сохранение НЕ является проблемой.

Мой файл my.cnf, расположенный по адресу

/usr/local/Cellar/mysql/5.7.17/support-files/my.cnf

my.cnf:

--defaults-extra-file=#
[client]
default-character-set = utf8mb4

[mysqld]
init-connect='SET NAMES utf8mb4'
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[mysql]
default-character-set = utf8mb4

, а затем сделал этот запрос:

ALTER TABLE comments CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

и это:

mysql> SET NAMES 'utf8mb4';
Query OK, 0 rows affected (0.00 sec) [then I put: init-connect='SET NAMES utf8mb4' in the cnf file]

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR 
Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8               |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8               |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_general_ci |
| collation_database       | utf8_general_ci    |
| collation_server         | utf8_general_ci    |
+--------------------------+--------------------+
10 rows in set (0.00 sec)

^ Тем не менее, насколько я понимаю, это работает только один раз ^

, потому что когда я запускаю эту команду после запуска приложения, она читает:

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8               |
| character_set_connection | utf8               |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8               |
| character_set_server     | utf8               |
| character_set_system     | utf8               |
| collation_connection     | utf8_general_ci    |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8_general_ci    |
+--------------------------+--------------------+
10 rows in set (0.03 sec)

Мой pom.xml имеет следующее:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF 8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>

    <property name="hibernate.connection.CharSet" value="utf8mb4" />
    <property name="hibernate.connection.characterEncoding" 
    value="utf8mb4"/>
    <property name="hibernate.connection.useUnicode" value="true"/>
</properties>

и на всех соответствующих HTML-страницах и на фрагменте заголовка, который у меня есть:

<meta charset="UTF-8">

Когда я System.out.println (comment.getBody ()) в методе PostMapping контроллера - как до, так и после сохранения комментария - я вижу смайлики в терминале просто отлично!Но когда я помещаю System.out.println (comment.getBody ()) в GetMapping для страницы, я вижу все странные символы, а не смайлики.Я действительно смущен.Как вы думаете, в чем проблема и что я должен сделать, чтобы решить ее?Любая помощь приветствуется, спасибо заранее!

(Из комментария:)

CREATE TABLE `comments` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `body` blob NOT NULL, 
    `created_date` datetime DEFAULT NULL, 
    `parent_id` bigint(20) DEFAULT NULL, 
    `post_id` bigint(20) DEFAULT NULL, 
    `user_id` bigint(20) DEFAULT NULL,
) ENGINE=InnoDB AUTO_INCREMENT=2084 DEFAULT CHARSET=utf8 

1 Ответ

0 голосов
/ 14 ноября 2018

Это похоже на «Маджибаке»;см. Проблема с символами UTF-8;я вижу не то, что я сохранил

Но, поскольку ð - это шестнадцатеричное F0, а F0 - начало Emoji (и т. д.), возможно, вы указали utf8 в MySQL вместо utf8mb4.Что такое "ð± and ð¶" должно быть ??

Spring / Hibernate:

Hibernate XML:

<property name="hibernate.connection.CharSet">utf8mb4</property>
<property name="hibernate.connection.characterEncoding">utf8</property>
<property name="hibernate.connection.useUnicode">true</property>

URL-адрес соединения: db.url=jdbc:mysql://localhost:3306/db_nameuseUnicode=true&character_set_server=utf8mb4

CREATE TABLE

DEFAULT CHARSET=utf8 говорит о том, что все столбцы VARCHAR и TEXT будут CHARSET utf8 , если не переопределены .

body blob NOT NULL, - Вы даже не используете текстовый тип данных!BLOB говорит: "просто добавь байты; даже не думай о CHARSET".

Из-за BLOB, если Emoji входит в body, байты должны приходитьидентично тому, как они вошли. Но давайте проверим кое-что еще.Пожалуйста, получите HEX(body), желательно для очень короткого тела, возможно, с ничего, кроме эмодзи.

Например, гекс для ? -

F09F9881 -- correctly in utf8mb4 (aka "UTF-8" outside MySQL).  Note leading F0
C3B0C5B8CB9CC281 -- "Double encoded".  Might display as 😠 Note leading ETH (ð)
...