转:Linux字符编码方式

首先,解释一下字符集:

汉字编码:
* GB2312字集是简体字集,全称为GB2312(80)字集,共包括国标简体汉字6763个。 *
BIG5字集是台湾繁体字集,共包括国标繁体汉字13053个。 *
GBK字集是简繁字集,包括了GB字集、BIG5字集和一些符号,共包括21003个字符。 *
GB18030是国家制定的一个强制性大字集标准,全称为GB18030-2000,它的推出使汉字集有了一个“大一统”的标准。

ASCII:
American Standard Code for Information Interchange,美国信息交换标准码。
目前计算机中用得最广泛的字符集及其编码,由美国国家标准局(ANSI)制定。 它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。
ASCII字符集由控制字符和图形字符组成。
在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),其最高位(b7)用作奇偶校验位。
所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。
奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1。
偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

UTF:
Unicode 的实现方式不同于编码方式。
一个字符的Unicode编码是确定的,但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现
方式有所不同。 Unicode的实现方式称为Unicode转换格式(Unicode Translation Format,简称为 UTF)。 *
UTF-8:
8bit变长编码,对于大多数常用字符集(ASCII中0~127字符)它只使用单字节,而对其它常用字符(特别是朝鲜和汉语会意文字),它使用3字节。
* UTF-16:
16bit编码,是变长码,大致相当于20位编码,值在0到0x10FFFF之间,基本上就是unicode编码的实现,与CPU字序有关。
注意:ASCII char (2) ;UTF-8 宽字符 wchar 4倍 。兼容性最好的编码就是UTF-8! 毕竟GBK/GB2312是国内的标准,当我们大量使用国外的开源软件时,UTF-8才是编码界最通用的语言。

在Linux 中通过locale 来设置程序运行的不同语言环境,locale 由ANSI C 提供支持。locale 的命名规则为<
语言>_< 地区>.< 字符集编码> ,如zh_CN.UTF-8 ,zh 代表中文,CN
代表大陆地区,UTF-8 表示字符集。在locale 环境中,有一组变量,代表国际化环境中的不同设置:
1.    LC_COLLATE
定义该环境的排序和比较规则
2.    LC_CTYPE
用于字符分类和字符串处理,控制所有字符的处理方式,包括字符编码,字符是单字节还是多字节,如何打印等。是最重要的一个环境变量。
3.    LC_MONETARY
货币格式
4.    LC_NUMERIC
非货币的数字显示格式
5.    LC_TIME
时间和日期格式
6.    LC_MESSAGES
提示信息的语言。另外还有一个LANGUAGE 参数,它与LC_MESSAGES 相似,但如果该参数一旦设置,则LC_MESSAGES
参数就会失效。LANGUAGE
参数可同时设置多种语言信息,如LANGUANE="zh_CN.GB18030:zh_CN.GB2312:zh_CN" 。
7.    LANG
LC_* 的默认值,是最低级别的设置,如果LC_* 没有设置,则使用该值。类似于 LC_ALL 。
8.    LC_ALL
它是一个宏,如果该值设置了,则该值会覆盖所有LC_* 的设置值。注意,LANG 的值不受该宏影响。
一个例子:
设置前,使用默认locale

[[email protected] ~]# locale

LANG="POSIX"

LC_CTYPE="POSIX"

LC_NUMERIC="POSIX"

LC_TIME="POSIX"

LC_COLLATE="POSIX"

LC_MONETARY="POSIX"

LC_MESSAGES="POSIX"

LC_PAPER="POSIX"

LC_NAME="POSIX"

LC_ADDRESS="POSIX"

LC_TELEPHONE="POSIX"

LC_MEASUREMENT="POSIX"

LC_IDENTIFICATION="POSIX"

LC_ALL=
设置后,使用zh_CN.GDK
中文locale

[[email protected] ~]# export LC_ALL=zh_CN.GBK

[[email protected] ~]# locale

LANG=zh_CN.UTF-8

LC_CTYPE="zh_CN.GBK"

LC_NUMERIC="zh_CN.GBK"

LC_TIME="zh_CN.GBK"

LC_COLLATE="zh_CN.GBK"

LC_MONETARY="zh_CN.GBK"

LC_MESSAGES="zh_CN.GBK"

LC_PAPER="zh_CN.GBK"

LC_NAME="zh_CN.GBK"

LC_ADDRESS="zh_CN.GBK"

LC_TELEPHONE="zh_CN.GBK"

LC_MEASUREMENT="zh_CN.GBK"

LC_IDENTIFICATION="zh_CN.GBK"

LC_ALL=zh_CN.GBK
"C" 是系统默认的locale ,"POSIX" 是"C" 的别名。所以当我们新安装完一个系统时,默认的locale 就是C 或POSIX 。
在Debian 中安装locales 的方法如下:
· 通过apt-get install locales 命令安装locales 包
· 安装完成locales 包后,系统会自动进行locale 配置,你只要选择所需的locale ,可以多选。最后指定一个系统默认的locale 。这样系统就会帮你自动生成相应的locale 和配置好系统的locale 。
· 增加新的locale 也很简单,用dpkp-reconfigure locales 重新配置locale 即可。
· 我们也可手动增加locale ,只要把新的locale 增加到/etc/locale.gen 文件中,再运行locale-gen
命令即可生成新的locale 。再通过设置 上面介绍的LC_* 变量就可设置系统的locale 了。下是一个locale.gen 文件的样例。
·# This file lists locales that you wish to have built. You can find a list

·# of valid supported locales at /usr/share/i18n/SUPPORTED. Other

·# combinations are possible, but may not be well tested. If you change

·# this file, you need to rerun locale-gen.

·#

·zh_CN.GBK GBK

·zh_CN.UTF-8 UTF-8
-----------------------------------------
在我看来只要搞清楚LANG和SUPPORTED就OK了,其他可能平时也用不太多。再参考篇文章,如下,是讲如何设置环境变量的。
-------------------------------------------
修改 /etc/sysconfig/i18n 文件,如
LANG="en_US.UTF-8",xwindow会显示英文界面,
LANG="zh_CN.GB18030",xwindow会显示中文界面。
还有一种方法 cp /etc/sysconfig/i18n $HOME/.i18n
修改 $HOME/.i18n 文件,如
LANG="en_US.UTF-8",xwindow会显示英文界面,
LANG="zh_CN.GB18030",xwindow会显示中文界面。
这样就可以改变个人的界面语言,而不影响别的用户

修改后的/etc/sysconfig/i18n 文件为:
LANG="en_US.UTF-8"
SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"
SYSFONT="latarcyrheb-sun16"
LC_ALL="en_US.UTF-8"
export LC_ALL

设置完毕后重启或者用rc.local使生效
或修改登录用户的.bash_profile文件加入
export LANG=zh_CN.GB18030
export LANGUAGE=zh_CN.GB18030:zh_CN.GB2312:zh_CN

-----------------------------------------------------------------------------------------------

一定要知道Windows XP 是GB2312的编码,如果你的服务器字符集不是这个,估计就会是乱码,所以要调整。

有些人在调整的时候,说我改了系统环境变量,结果造成用户内容显示乱码,无非解决的方法就是两个:
1.用iconv转化为目前的编码
2.用你原来使用的编码

看了这两条,你肯定必须要明确,你原来的字符编码是如何的。说来说去,无非就是LANG SUPPORTED 和你原文件字符集的编码:)
当然了locale -a你可以看看目前系统里支持的字符集,如果不支持,还要安装奥。

时间: 2024-10-08 20:19:23

转:Linux字符编码方式的相关文章

刨根究底字符编码之十——Unicode字符集的字符编码方式CEF以及码点、码元

Unicode字符集的字符编码方式CEF以及码点.码元 一.字符编码方式CEF的选择 1. 由于Unicode字符集非常大,有些字符的编号(码点值)需要两个或两个以上字节来表示,而要对这样的编号进行编码,也必须使用两个或两个以上字节. 比如,汉字"严"的Unicode码(Unicode码点值.Unicode编号)是十六进制数4E25,转换成二进制数有15位(100 1110 0010 0101),对"严"这个字符的编号进行编码的话,至少需要2个字节.表示其他更大编号

Linux字符编码默认为UTF-8,如出现乱码可设置为GBK

Linux字符编码默认为UTF-8,如出现乱码可设置为GBK1.手动更改profile文件的命令: vi /etc/profile 也可以修改 /etc/sysconfig/i18n 文件,如 LANG="en_US.UTF-8" LANG="zh_CN.GB18030" 还有一种方法 cp /etc/sysconfig/i18n $HOME/.i18n 修改 $HOME/.i18n 文件,如 LANG="en_US.UTF-8" LANG=&q

python chardet模块查看字符编码方式

电脑配置:联想笔记本电脑 windows8系统 Python版本:2.7.8 本文章撰写时间:2014.12.25 作者:陈东陈 阅读说明: 1.本文都是先解释,后放图片: 2.文中斜体部分要么为需要输入的内容,要么为电脑本来的一些功能名称 如果没有安装chardet模块,需要先安装该模块. 总结: 中文字符在python自带的IDL和Sublime text2的编码方式不一样,这个问题我也不清楚,还请大牛能解答. 一.运行环境——python 2.7.8自带IDL 1.输入中文字符‘中国’ 输

(20161010)关于网页乱码和字符编码方式

网页出现乱码的原因一般是因为字符的编码方式不同. 字符编码是计算机技术的基础,对于计算机来说,所有的信息都是0或者1的二进制序列,计算机是无法直接识别和存储字符的,所以,字符必须经过编码才能被计算机处理. 一.两个概念:字符集和字符编码 字符集:直观上来讲就是人们统计预先规定好的一系列字符与二进制序列(数字)之间的映射关系. 比较常用字符集有ASCII.GBK.Unicode等. 但是当我们规定好了字符与数字之间的对应关系,但这并不代表计算机一定要按照字符对应的数字将数字本身直接存储,所以,我们

Linux字符编码转换 UTF8转GB3212

在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码.    一.利用iconv函数族进行编码转换    iconv函数族的头文 在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码.    一.利用iconv函数族进行编码转换    iconv函数族的头文件是iconv.h,使用前

linux查看字符编码

Linux 下查看文件字符编码和转换编码 Linux公社(LinuxIDC.com)于 2006 年 9 月 25 日注册并开通网站,Linux现在已经成为一种广受关注和支持的一种操作系统,IDC是互联网数据中心,LinuxIDC就是关于Linux的数据中心. LinuxIDC.com提供包括Ubuntu,Fedora,SUSE技术,以及最新IT资讯等Linux专业类网站. 如果你需要在 Linux 中操作 windows 下的文件,那么你可能会经常遇到文件编码转换的问题.Windows中默认的

刨根究底字符编码之十三——UTF-16编码方式

UTF-16编码方式 1. UTF-16编码方式源于UCS-2(Universal Character Set coded in 2 octets.2-byte Universal Character Set).而UCS-2,是早期遗留下来的历史产物. UCS-2将字符编号(即码点值)直接映射为字符编码(CEF,而非CES,详见前文中对现代字符编码模型的解释),亦即字符编号就是字符编码,中间没有经过特别的编码算法转换.因此,从现代字符编码模型的角度来看的话,此时并没有将编号字符集CCS与字符编码

linux系统字符编码详解

众所周知,地球上的语言多种多样,在计算机世界,自然也是要适应各种语言.我们安装各种系统的时候也是明示了要选择语言环境和支持的语言环境. 而linux系统的字符编码设置尤为复杂,这可能也是没有考虑到非技术人员去研究这些东西吧. 我遇到的事情是这样的,我们使用了docker,但是docker容器里的语言环境经常莫名错乱,搞得很头痛,所以偶尔就要切换,或者生成其他字符集.所以现在假设我们需要切换一个中文语言环境,而切换了之后是乱码的,也就是没用的. 基本上,乱码的原因就是没加载到合适的字符编码环境,即

刨根究底字符编码之十一——UTF-8编码方式与字节序标记

UTF-8编码方式与字节序标记 一.UTF-8编码方式 1. 接下来将分别介绍Unicode字符集的三种编码方式:UTF-8.UTF-16.UTF-32.这里先介绍应用最为广泛的UTF-8. 为满足基于ASCII.面向字节的字符处理的需要,Unicode标准中定义了UTF-8编码方式.UTF-8应该是目前应用最广泛的一种Unicode编码方式(但不是最早面世的,UTF-16要早于UTF-8面世).它是一种使用8位码元(即单字节码元)的变宽(即变长或不定长)码元序列的编码方式. 由于UTF-16对