• 浅谈乱码原因及解决方案


    前言

    其实作为程序猿来讲,中国的程序猿遇到的问题可能会比国外的程序猿遇到的问题多很多。
    一个原因是因为各种标准的制定、各种IDE的编写,都是由老外来完成的,制定出来的东西可能和中国人的习惯不太一样;还有一个原因就是因为国际编码的问题,通常,外国人写的东西无需对编码进行转换,默认的就是ISO-8859-1;到了中国,就涉及到本土化的问题,中文编码应当是GBK,这是本地化的编码。
    而各种标准、各种浏览器一般用的都是ISO-8859-1,所有就造成了两种编码之间的转换。所以后来出现了UTF8,来解决各种编码问题。UTF8基本上包含了地球上所有的可见字符,十分强大。
    但不幸的是,各种标准并没有按照这一编码来制定,而依然沿用以前的做法。
    所以,解决各种乱码问题,就成了中国程序猿的必不可少的技能之一。
    这篇文章,就是要和大家讨论种种乱码问题出现的原因,以及相应的解决办法,我目前已知的情况共有三种,下面就位大家一一讲解。

    IDE环境造成的乱码

    其实这个是非常让人郁闷的问题,有时候还真的很难发现。现在流行的两种JavaIDE,idea和eclipse。idea的所有默认编码都是UTF8格式,基本上统一所有编码,如果你再idea出现了乱码问题,一般不是idea自身的问题。
    如果你看到idea的控制台出现了中文乱码,这很有可能是你选用的字体不支持部分中文造成的,idea不背这个锅。
    对于eclipse,这货可能是为了让中国人写代码的时候更加方便,当你点击目录中的src,然后点击file->Properties->Resources,你会看到,TextFile Encoding默认是GBK。是不是很绝望,为了下次不再因为这个问题产生乱码,记得创建文件夹以后就配置一下src的encodeing,还是刚刚的那个路径,改成UTF-8就行了。
    也许你会说,我根本就没发现这里有什么问题啊,我一直是这种设置也没有发生过乱码。我只能说,那是因为你没有遇到过。
    最常见的一个场景就是web应用中(不使用框架),当你提交的表单中存在file域的时候,你可能会使用一些文件上传组件,这些组件处理信息的时候,会将表单中的数据变成UTF8或者你设置的格式,但是,如果你的文件编码是GBK的话,就肯定就会碰到乱码的问题了。具体原因有待深究,但个人觉得这可能是因为编译后的class字节码文件处理信息过程的问题。

    POST和GET方法传递参数造成的乱码

    如果你发现更改了文件编码并且重新build以后,还是出现乱码的问题,如果依然是web应用的话,那就很有可能是POST和GET方法传参造成的乱码。
    这个问题可以看我的文章,POST和GET方法乱码问题解决方案,写的其实非常详细了。

    数据库编码格式导致的

    如果你发现,你从数据库中读取出的数据是乱码的,那么原因也很简单,是因为数据库的字符集配置问题。
    首先,进入mysql的控制台,也就是命令行中。输入如下语句,查看mysql的字符集配置。
    - 方法一:show variables like 'collation_%';
    - 方法二:show variables like 'character_set_%';

    如果你看到,字符集列表中有显示各种字符集的配置都是拉丁文,也就是lantin这样子的。那么毫无疑问是因为字符集的配置问题了。对于不同的系统,配置的方法都是相同的,那就是找到mysql文件的配置信息路径,一般linux可以按照我的这篇文章来进行配置,windows也可以参考,只需要找到配置文件,做最后的字符配置操作即可。windows的mysql配置文件一般在mysql的安装目录下,如果没有,那么可以自己建一个名为my.cnf的文件(如果无效,试试新建mysqld.cnf文件),然后在文件中输入如下配置信息:

    [mysqld]
    character-set-server=utf8
    [mysql]
    default-character-set=utf8
    [client]
    default-character-set=utf8

    文章链接:mysql乱码解决方案

    结语

    好了,这次的文章就到这里了,如果你喜欢我的文章,请关注我,可以点个赞,支持一下我。想和我交个朋友的,可以邮件联系我roobtyan@outlook.com。感谢您的阅读,再见!

  • 相关阅读:
    java 多线程 Callable -- 分段处理一个大的list 然后再合并结果
    java实现 比较两个文本相似度-- java 中文版 simHash 实现 ,
    spring 多线程 写入数据库 和 写入 xml文件
    爬虫入门 手写一个Java爬虫
    java web 入门级 开发 常用页面调试方法
    Java 递归调用 recursive 给一个参数 返回一大堆
    javaWeb 基础知识
    用 eclipse 创建一个简单的 meaven spring springMvc mybatis 项目
    【题解】【LibreOJ Beta Round #5】游戏 LOJ 531 基环树 博弈论
    【题解】Popping Balls AtCoder Code Festival 2017 qual B E 组合计数
  • 原文地址:https://www.cnblogs.com/roobtyan/p/9576686.html
Copyright © 2020-2023  润新知