其实很长一段时间都受到字符集和字符编码的困扰,有时候一些概念性的东西,还有编码过程中没有一些需要注意的地方没有及时注意,所以常常会造成一些困扰,乱码问题对于困扰了相当一部分人,整理下初步的知识,对自己和别人能有一些帮助。
1).首先先了解下概念性的东西,编码,字符,字符集,字符编码
编码是信息从一种形式或格式转换为另一种形式的过程也称为计算机编程语言的代码简称编码。用预先规定的方法将文字、数字或其它对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机、电视、遥控和通讯等方面广泛使用。编码是信息从一种形式或格式转换为另一种形式的过程。解码,是编码的逆过程。
字符是指计算机中使用的字母、数字、字和符号,包括:1、2、3、A、B、C、~!·#¥%……—*()——+等等。是一种带替意思的字符。
字符集(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。中文文字数目大,而且还分为简体中文和繁体中文两种不同书写规则的文字,而计算机最初是按英语单字节字符设计的,因此,对中文字符进行编码,是中文信息交流的技术基础。
字符编码(英语:Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其它符号编号,并用7比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以1个字节的方式存储。
2).日常编码中常见的GBK,UTF-8,ISO-8859-1是不同类型的编码,不同的字符集对于同一个编码的解释不同,一种编码可以对应不同的字符集。
3). 乱码的常见原因
.日常开发中会面临解码(读取过程)、编码(写入过程),编码和解码过程中如果设置的字符集不同势必会造成乱码的问题,这也是造成乱码的一个重要原因。
4).一些环境的默认编码
wind默认的编码是GBK,基本上不用考虑这方面的影响,而且是无法修改的,ecplise默认的也是GBK
linux默认编码是UTF-8,mariadb默认的编码则是IS0-8859-1
在编码过程中如果没有设定编码方式的情况下,编码和解码会根据环境的编码方式及行编码和解码
例如:
在Linux下,编码和解码过程不设定编码方式的话,会默认使用linux默认的UTF-8来进行编码和解码
在linux查看编码方式:
locale
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
修改:
vi /etc/sysconfig/i18n下添加如果下
export LC_ALL="zh_CN.GBK"
export LANG="zh_CN.GBK"
也可以修改配置文件 vi /etc/sysconfig/i18n
字符:系统环境变量修改时要慎重加设置
5).Mariadb的编码认识
1.查看方式
show variables like "%character%";show variables like "%collation%";
show variables like "%character%";show variables like "%collation%";
2.修改:
/etc/mysql/my.cnf
[mysqld] init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake
mysqld] init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
client]
default-character-set=utf8
[mysql]
default-character-set=utf8
修改后重启服务生效。
修改后重启服务生效。
3.SET character_set_server = 'utf8';这种设置方法的话只是修改当前会话的编码方式,不是永久性设置。
character_set_server = 'utf8';这种设置方法的话只是修改当前会话的编码方式,不是永久性设置。