当数据涉及中文时,我们一般使用utf-8编码来解决字符的显示问题,但光在程序中支持UTF-8有时还是不够的,环境及输入文件的问题也很突出。下面记录几个问题及解决方法:

1. JAVA读取properties文件时第一个属性总是读取不到

发现这个很奇怪的现象,用vim查看fileenoding是UTF-8,没有问题。在文件头插入一行,property就可以正常读取到。

最后发现还是properties文件的编码问题,UTF-8 和 UTF-8 with BOM 的区别,有BOM的文件在文件头有encoding信息,从而影响到了properties文件的正常解析

linux环境下一般不需要BOM信息,通过 file 命令可以查看文件有无BOM信息

找到一种移除BOM信息的方法:

find . -name info.txt | xargs -I {} sh -c "sed 's/^\xEF\xBB\xBF//' {} > {}.bak”
find . -name info.txt | xargs -I {} sh -c 'mv {}.bak {}'


2. 调用JDBC写入数据库后发现数据是乱码

虽然写入数据库的字符是正确的UTF-8编码,数据库的encoding也是utf8,字符集是utf8_general_ci,最后显示在数据库里面的确实乱码

原因是还少了mysql server的配置

通过mysql command可以查看当前数据库的encoding

mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE '%collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.01 sec)

更改设置的方式是修改数据库配置文件,我的位置在/etc/mysql/mysql.conf.d/mysqld.cnf,添加配置

[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci

更改后重启数据库即可