java - 表情符号在 ajax 后在 MySQL 表列和 HTML 中呈现,但在页面重新加载后不呈现。为什么?
问题描述
我已经实现了一个表情符号选择器,用于在我的 Spring & Thymeleaf 网络应用程序/博客上发表评论。
目前,我可以选择一个表情符号,看到它出现在 textarea 中,提交表单,评论保存在控制器 post 方法中到我的 MySQL 5.7.17 db 表中 - 我可以在表格列中看到表情符号艺术 - 评论通过ajax返回,我可以在页面上看到表情符号。耶,呜呼!
但!重新加载页面后......我看到了这个:
“ð±和ð¶”
是什么赋予了??
为了在 mysql 中插入表情符号,我遵循了这个教程:
https://mathiasbynens.be/notes/mysql-utf8mb4
存储不是问题。
我的 my.cnf 文件,位于
/usr/local/Cellar/mysql/5.7.17/support-files/my.cnf
我的.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">
当我在控制器的 PostMapping 方法中使用 System.out.println(comment.getBody()) 时 - 在我保存评论之前和之后 - 我可以在终端中看到表情符号就好了!但是当我在页面的 GetMapping 中 System.out.println(comment.getBody()) 时,我看到所有奇怪的字符而不是表情符号。我真的很困惑。您认为问题可能是什么,我应该怎么做才能解决它?任何帮助表示赞赏,在此先感谢您!
(来自评论:)
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
解决方案
这看起来像“Mojibake”;请参阅UTF-8 字符的问题;我看到的不是我存储的
但是,由于ð
是 hex F0
,并且F0
是 Emoji (等)的开始,可能是您utf8
在 MySQL 中指定而不是utf8mb4
. 应该是什么"ð± and ð¶"
??
春天/休眠:
休眠 XML:
<property name="hibernate.connection.CharSet">utf8mb4</property>
<property name="hibernate.connection.characterEncoding">utf8</property>
<property name="hibernate.connection.useUnicode">true</property>
连接网址:
db.url=jdbc:mysql://localhost:3306/db_nameuseUnicode=true&character_set_server=utf8mb4
创建表
DEFAULT CHARSET=utf8
表示 allVARCHAR
和TEXT
columns 将被覆盖,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 (ð)
推荐阅读
- php - CodeIgniter-CSS 和 JS 未在服务器上加载
- pandas - pyspark 中的 pandas cumcount
- html - 垂直显示小部件框
- filter - Countif/Sumif 应该在 arrayformula 中显示空值而不是 0
- google-apps-script - 如何计算Google表格中单元格中出现多次的单词每次出现之间的字符数?
- html - 弯曲方向组件设置
- c# - 在 Knockoutjs 中动态添加行
- python - re.sub() 如何改变不可变的 Python 字符串?
- laravel - Laravel 在条件下在路由中加载中间件
- android - Google 的 SupportMapFragment 类型转换异常与 v4 Fragment