中文字符编码问题

举报
SHQ5785 发表于 2024/03/08 09:08:48 2024/03/08
【摘要】 前言      遇到的问题千奇百怪,在往mysql数据表存储带有中文字符的字符串时显示乱码。经过代码输出测试发现插入语句如下:       在数据库内查询,发现存储的内容为乱码。       尝试在mysql中直接插入语句。如下:      INSERT INTO lm_user_med (uid,medid,medname,medprice,num)VALUES ('u1835310208...

前言

      遇到的问题千奇百怪,在往mysql数据表存储带有中文字符的字符串时显示乱码。经过代码输出测试发现插入语句如下:

 

      在数据库内查询,发现存储的内容为乱码。

 

      尝试在mysql中直接插入语句。如下:

      INSERT INTO lm_user_med (uid,medid,medname,medprice,num)VALUES ('u18353102088','TZ110204801','感冒灵颗粒1','8.00','1');

      由上面的数据表可以看出,存储正常。而且在页面显示正常。

 

      为此,可以判定是数据表的字符编码出现了问题。

      找了半天,原来问题出在这,可坑苦我了,连接数据库时未指定编码方式!!

      jdbc:mysql://localhost:3308/lmapp?useUnicode=true&characterEncoding=utf8

      在进行数据库连接时一定要指定编码方式!(多么痛的领悟~)

吐槽

      团队开发时,有一套完善的编码规范至关重要!

      不怕BOSS的BUG,就怕没有良好编码风格的队友!

继续

      在客户端一切正常,但是放到服务器上,还是出现了问题。

 

     从输出信息可以判断在服务器端,获取中文字符时就已经出现了问题,而与数据库并无关系。回到程序中,相应字符编码如下:

 

      改用默认编码String medname=new String(medname1.getBytes(),"UTF-8");后,服务端输出如下:

 

      部分中文字符得到了解析。也是醉了!明天再解决吧!

      改变一下思路,首先查看传入参数的编码格式。有关编码格式的工具类,详见博文《java 判断字符串编码类型》。

      在本地:

 

      服务端:

 

      可见两者将在利用http post请求方式传参时所使用的编码方式不同,但是这是一个项目,编码方式相同毋庸置疑。

      request.setCharacterEncoding("UTF-8");

困惑~

      既然服务端传参时本身就是UTF-8,但是其内容还是乱码!

      转换编码方式:

      String medname=new String(medname1.getBytes("GBK"),"UTF-8");

 

      可发现,只有4个中文字符得到了正确转义。存在中文字符编码转换过程中字符丢失现象。有关字符编码格式,详见博文《String.getBytes()方法中的中文编码问题》。

再次更换编码方式,将页面显示编码改为“GBK”,这样中文字符就可以正常显示了。直接在请求参数中即可获取到正确的参数(编码方式为GBK),而无需再次转码。但是在本地测试时仍然出现乱码现象,因为其编码方式为ISO-8859-1。

 

 

      同样,在药品说明书展示时同样需要指定编码方式为“GBK”。这样自己就有一个大大的疑惑了:“为何本地与服务器上的编码方式会不同?”详见博文《编码中的setCharacterEncoding 理解》。在Tomcat5.0中,默认情况下使用ISO- 8859-1对URL提交的数据和表单中GET方式提交的数据进行重新编码(解码),而不使用该参数对URL提交的数据和表单中GET方式提交的数据进行重新编码(解码)。这样本地输出的编码方式为ISO8859-1就不足为奇了。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。