字符编码-理解跨平台中文乱码
来源:互联网 发布:网上火车票软件 编辑:程序博客网 时间:2024/05/16 14:33
首先,解释一下字符集: 汉字编码: ASCII: UTF: 在Linux 中通过locale 来设置程序运行的不同语言环境,locale 由ANSI C 提供支持。locale 的命名规则为< 语言>_< 地区>.< 字符集编码> ,如zh_CN.UTF-8 ,zh 代表中文,CN 代表大陆地区,UTF-8 表示字符集。在locale 环境中,有一组变量,代表国际化环境中的不同设置: [root@db-wanggaofei ~]# 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= [root@db-wanggaofei ~]# 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 · · · · · zh_CN.GBK GBK · zh_CN.UTF-8 UTF-8 修改后的/etc/sysconfig/i18n 文件为: 设置完毕后重启或者用rc.local使生效 ------------------------------------------------------------------------------------------------------- 前面内容转载自:http://hi.baidu.com/xjll1314/blog/item/0891bbd4c4d4c62507088bb7.html 实际就下面这点东西 两个概念: 1 编码标准(字符集):解释编码与字符的映射关系。如gbk,gb2312,unicode 等。前两个既是编码标准也是编码方式 2 编码方式:解释字符在内存中如何存放。如gbk(2个字节1个汉字),utf-8(3个字节1个汉字),utf-16。 这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。 常见问题: 在windows下默认是ansi编码,也就是使用的gb2312编码方式,在windows中的cpp文件中存在注释,在将文件拖动到linux中,linux显示时,中文注释会出现乱码,这是由于中文在windows下使用gb2312,但linux使用utf-8进行解释,编码方式不同,就造成了乱码显示。
* GB2312字集是简体字集,全称为GB2312(80)字集,共包括国标简体汉字6763个。 * BIG5字集是台湾繁体字集,共包括国标繁体汉字13053个。 * GBK字集是简繁字集,包括了GB字集、BIG5字集和一些符号,共包括21003个字符。 * GB18030是国家制定的一个强制性大字集标准,全称为GB18030-2000,它的推出使汉字集有了一个“大一统”的标准。
American Standard Code for Information Interchange,美国信息交换标准码。 目前计算机中用得最广泛的字符集及其编码,由美国国家标准局(ANSI)制定。 它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。 ASCII字符集由控制字符和图形字符组成。 在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),其最高位(b7)用作奇偶校验位。 所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。 奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1。 偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。
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才是编码界最通用的语言。
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
:
设置后,使用zh_CN.GDK
中文locale
:
[root@db-wanggaofei ~]# export 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.
#
-----------------------------------------
在我看来只要搞清楚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会显示中文界面。
这样就可以改变个人的界面语言,而不影响别的用户
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
或修改登录用户的.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你可以看看目前系统里支持的字符集,如果不支持,还要安装奥。
- 字符编码-理解跨平台中文乱码
- 字符编码和中文乱码
- Python字符编码 中文乱码
- mysql中文字符编码乱码解决方案
- 字符编码和中文乱码小叙
- java中文字符乱码编码转换大全
- linux中文乱码CRT字符编码设置
- response字符编码解决中文乱码
- javaweb中文字符编码乱码问题
- java中文字符乱码编码转换大全
- java中文字符乱码编码转换大全
- CentOS中文乱码修改字符编码使用支持中文
- 字符编码知识以及mysql中文乱码的解决
- C+++Utf8字符转换Gb2312编码,解决TinyXml中文乱码
- HTML 字符编码 设定(解决可能引起中文乱码问题)
- python中文字符编码decode,encode以及乱码解决总结
- mysql字符编码并解决中文乱码问题
- python中文字符编码decode,encode以及乱码解决总结
- 输入数字,输出中文大写
- 基本数据结构(算法导论)与python
- C#图片格式打印
- 当使用Outlook2007发送邮件时,收件人收到名为Winmail.dat的附件
- SAP职位发布 SD PP MM QM WM FI CO PS QM ABAP 对日ABAP
- 字符编码-理解跨平台中文乱码
- ListActivity与Menu
- Fedora 学习总结
- MSVC 和 MinGW DLL call each other
- 关于Activity和Task的设计思路和方法
- 十五、Hibernate查询语言
- 感动全世界的一个童话 【看懂的算情圣了】
- The jQuery UI CSS Framework(中文说明)
- 一个有意思的UNICODE问题:导出excel表格