项目在Linux上运行发现乱码引发的思考

这里的表现: 我部署到Centos6环境的 项目发现中文乱码,通过该项目发送的邮件也是中文乱码

 

期间遇到了一些问题,我讲述一下我的解决过程。

 

首先我先检查我的 项目是否 是 UTF-8的,将自己项目文件的默认编码设置为 UTF-8

然后打包到服务器中,

查看 服务器编码

> locale

项目在Linux上运行发现乱码引发的思考

 

网上一大把博客说:

centos6环境下是 修改 /etc/sysconfig/i18n文件

vim /etc/sysconfig/i18n

输入i,进入 编辑模式

LANG="en_US.UTF-8"

SYSFONT="latarcyrheb-sun16

输入 ESC,退出编辑模式

输入 :wq 保存退出

 

但是你要注意你服务器安装了哪些语言包

locale -a

这里我决定用常用英文版的UTF8的环境,所以我查看了一下,有该包 en_US.utf8

 

项目在Linux上运行发现乱码引发的思考

确认无误后,我进行了服务器重启 ,网上说 source 该文件即可,其实是不对的,centos6环境该类文件是必须重启才生效的

输入 reboot

等待一定时间重连服务器

项目在Linux上运行发现乱码引发的思考

然而发现,输入 locale 还是以前的结果

打印 echo $LANG 环境变量为空

 

这个时候就要让我很迷茫了,这个时候我同事提醒我是不是我用的软件的问题,我用的是SSH(Secure Shell Client)

 

但在该软件我并没有找到设置编码显示的

 

这里我用回了最顺手的 XShell

项目在Linux上运行发现乱码引发的思考

 

确定软件显示的编码为UTF-8

但仍然没有效果。

 

直到我执行了这句话, yum install fonts-chinese,安装英文版的中文包

然后查看 locale 发现已经全部改过来了。

这个时候,你再重启你的项目发现打印的日志和发送的邮件都恢复了正常。

注意: 如果你要用 zh_US.UTF-8 ,中文版UTF-8,你应该安装的是 yum groupinstall chinese-support

 

项目在Linux上运行发现乱码引发的思考

注意: 你要确定你的服务器和你的项目要统一哪种编码,如果你要设置为 GBK,请统一将服务器和项目编码都设置。

 

后续的思考:

在这个问题中,我其实误打误撞的解决了。但如果要明白原理和配置的过程

那么我就应该知道

  1. locale 指令的作用?
  2. linux中哪些类型的文件 不能source 生效,而是要重启呢?
  3. locale -a的编码语言,为什么只设置en_US.utf8无效,一定要安装 英文版的中文包 fonts-chinese呢?
  4. 我之前以为是oracle的问题,因为我查看我的oracle默认编码是 中文简化GBK版本的,这就牵扯到另外一个问题了,为什么 我们通过mybatis或者jdbc等等sql查询,获取的数据可以无视你项目的编码配置做到不乱码呢?

 

 

1、 locale 指令

locale

locale 中文意思是 语言环境。也就是说 你打算让你的系统处于哪种语言环境

 

将locale展开,发现有很多类型的参数,这些参数代表什么呢?

LANG=语言 LC_CTYPE=语言符号及分类 LC_NUMERIC=数字 LC_TIME=时间 LC_COLLATE="比较和习惯 LC_MONETARY=货币 LC_MESSAGES=信息表达 LC_PAPER=默认纸张尺寸大小 LC_NAME=姓名书写方式 LC_ADDRESS=地址书写方式 LC_TELEPHONE=电话号码书写方式 LC_MEASUREMENT=度量衡表达方式 LC_IDENTIFICATION=对locale自身包含信息的概述 LC_ALL=

它可以精准设置 每种方式的语言环境

 

LC_ALL, LC_*, LANG之间的关系

设定locale就是设定12大类的locale分类属性,即12个LC_*。

除了这12个变量可以设定以外,为了简便起见,还有两个变量:

LC_ALL和LANG它们之间有一个优先级的关系:LC_ALL;LC_*LANG;可以这么说,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值。

从优先级角度:LC_ALL > LC_* > LANG

 

2、 linux中哪些类型的文件 不能source 生效,而是要重启呢?

Linux中source命令的用法

source命令:

source命令也称为“点命令”,也就是一个点符号(.)。source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。

用法:

source filename 或 . filename

 

我们还需要了解 linux 的 etc文件夹,该名称来源于法语的 et cetera 翻译成中文就是 等等 的意思

etc 文件夹中放着的是系统管理和配置文件

 

3、locale -a的编码语言,为什么只设置en_US.utf8无效,一定要安装 英文版的中文包 fonts-chinese呢?

发现并不是安装了中文包了原因,头都大了

 

 

4、 为什么 JAVA不需要管oracle的编码格式,可以直接取数据在JAVA中自适应项目编码呢?

 

查阅资料,发现这个就是 数据库驱动包的作用了。

驱动包:https://mvnrepository.com/artifact/com.oracle/ojdbc6

驱动类名:oracle.jdbc.driver.OracleDriver

 

从这里我们可以确定 jdbc驱动包可以 将数据库的数据转换二进制数据进行交互,并可以转换成双方支持的编码格式。

由于网上只有简单的jdbc驱动程序描诉,各大厂商未开发源码阅读,这里就只概述我们这种驱动程序

 

百度百科定义:

JDBC(java database connectivity)驱动程序是对JDBC规范完整的实现,它的存在在JAVA程序与数据库系统之间建立了一条通信的渠道。

 

JDBC 的基本层次结构由 Java 程序、JDBC 驱动程序管理器、驱动程序和数据库四部分组成

 

我们常用的在 java程序中配置一个maven,添加一个jar的方式是属于

纯Java的JDBC驱动程序

纯Java的JDBC驱动程序(Direct-to-DatabasePureJavaDriver)这类驱动程序是直接面向数据库的纯Java驱动程序,即所谓的"瘦"驱动程序。使用这类驱动程序时无需安装任何附加的软件(无论是本地计算机或是数据库服务器端),所有存取数据库的操作都直接由JDBC驱动程序来完成,此类驱动程序能将JDBC调用转换成DBMS专用的网络协议,能够自动识别网络协议下的特殊数据库并能直接创建数据连接。

 

第四类驱动程序可能是最佳的JDBC驱动程序类型。这是一类新型的驱动程序

优点:

  • 它由数据库厂商提供,能够实现对于本公司数据库系统的最优化访问。
  • 它无需安装任何附加软件,不会增加任何额外开销,并且由纯Java语言开发而成,
  • 允许从客户机到数据库服务器的直接调用,能够自动识别网络协议下的特殊数据库并能直接创建数据连接,
  • 驱动程序的效率最高,拥有最佳的兼容性。

缺点:

  • 由于使用DBMS专用的网络协议,可能不被防火墙支持,在Internet中会存在潜在安全隐患,成为这类驱动最大的缺陷。
  • 不同DBMS的驱动程序不同,在一个异构计算环境中,驱动程序的数量可能会比较多。虽然有以上缺点,但是瑕不掩玉,

此类驱动程序的诸多优点使得它的缺点并不突出,在企业级应用软件中,是应优先考虑的。因此,一个Servlet程序,要适应不同的操作系统,最好使用此类驱动;这种驱动也非常适合Applet程序,事实证明它能安全通过TCP/IP协议连接到数据库。