ascii unicode utf-8 utf-16 gbk gb2312 gb18030


ASCII

表语英语及西欧语言。

ASCII是用7位表示的,能表示128个字符;其扩展使用8位表示,表示256个字符。

ASCII从00到7F,扩展从00到FF。


GB2312

中文简体字符集。兼容ASCII 码,

使用2个字节表示,能表示7445个符号,包括6763个汉字,几乎覆盖所有高频率汉字。

高字节从A1到F7, 低字节从A1到FE。将高字节和低字节分别加上0XA0即可得到编码。


GBK

GB2312的扩展,加入对繁体字的支持,兼容GB2312

使用2个字节表示,可表示21886个字符

高字节从81到FE,低字节从40到FE


GB18030

解决了中文、日文、朝鲜语等的编码,兼容GBK

它采用变字节表示(1 ASCII,2,4字节)。可表示27484个文字。

1字节从00到7F; 2字节高字节从81到FE,低字节从40到7E和80到FE;4字节第一三字节从81到FE,第二四字节从30到39。


UNICODE

Unicode学名"Universal Multiple-Octet Coded Character Set",简称UCS,是一套由国际组织维护的字符编码。UCS为现存的每一个字符都赋予一个唯一码值(code point),通常表示为U+xxxx,其中xxxx为对应的16进制码值。

  UCS有两种格式:UCS-2 和 UCS-4。UCS-2为2字节编码,范围从U+0000~U+FFFF;UCS-4为4字节编码,范围从U+00000000~U+7FFFFFFFF。目前Unicode4.0标准中,U+0000~U+FFFF区间已经包含了世界上所有语言的常用文字,简称BMP(Basic Multilingual Plane),加上其它的特殊符号扩展,最高也只用到了U+0010FFFF。

目前,UCS-4只是在UCS-2前面加了0×0000



UTF编码

UCS字符在计算机中的表示方式常用的有UTF-8,UTF-16,UTF-32。UTF-32用32位来表示单个UCS字符,跟UCS-4的码值一一对应。UTF-16以16位为单元来编码UCS字符,U+0000~U+FFFF范围内用单个16位值来表示,跟UCS-2一一对应,而U+10000~U+10FFFF范围内的字符则需要用2个连续的16位值来表示;UTF-8以8位为单元进行编码,跟UTF-16类似,需要用到1~6个连续的8位值来表示单个UCS字符(实际上由于目前UCS最高只用到了U+10FFFF,所以UTF-8编码的单个字符的长度不会超过4Byte)。



GB2312所包含的character 是 unicode的一个子集罢了,但不是说一个character在GB2312与Unicode中的编码值一致。


setlocale

charsetlocale(int category, const char* locale);

category:为locale分类,表达一种locale的领域方面,通常有下面这些预定义常量:LC_ALL、LC_COLLATE、LC_CTYPE、LC_MESSAGES、LC_MONETARY、LC_NUMERIC、LC_TIME,其中 LC_ALL 表示所有其它locale分类的并集。

locale:为期望设定的locale名称字符串,在Linux/Unix环境下,通常以下面格式表示locale名称:language[_territory][.codeset][@modifier],language 为 ISO 639 中规定的语言代码,territory 为 ISO 3166 中规定的国家/地区代码,codeset 为字符集名称。

windows 的CRT中setlocale() 版本

  1. lang[_country_region[.code_page]]:虽然形式与 glibc 的相同,当 Windows 的 locale 名并不符合 POSIX 的规范,比如采用 GBK 字符集的大陆中文,POSIX 的名字为:zh_CN.GBK,而在 Windows CRT 中要用:Chinese_People's Republic of China.936

  2. .code_page:可以直接使用代码页来设定 locale,而且可以使用 .OCP、.ACP 两个伪代码页,.OCP 表示从系统获得的当前活动的 OEM 代码页,.ACP 表示从系统获得的活动 ANSI 代码页。

  3. "":根据 Windows 系统环境的活动 ANSI 代码页来设定 locale。.OCP、.ACP、和环境代码页都受控制面板中“区域与语言选项”的设置影响。默认装完简体中文版 Windows 后,活动的 ANSI 代码页为:936(即 GBK),可用 chcp 控制台程序查看活动代码页。

  4. NULL:取回当前 locale,不改变当前 locale。

当向终端、控制台输出 wchar_t 类型的字符时,需要设置 setlocale(),因为通常终端、控制台环境自身是不支持 UCS 系列的字符集编码的,使用流操作函数时(如:printf()),在标准/RT库实现的内部会将 UCS 字符转换成合适的本地 ANSI 编码字符,转换的依据就是 setlocale() 设定的活动 locale,最后将结果字符序列传递给终端,对于来自终端的输入流这个过程刚好相反。

可以用重定向输出流到文件的方法验证上面的机制:无论是 Windows CRT、Linux glibc、Cygwin glibc,使用 wprintf() 打印 wchar_t 字符文本时,重定向到文件的内容总是 GBK、UTF-8 等本地 ANSI 编码,而不会是 UCS 编码。



在Linux下,可以使用 locale -a 命令查看系统中所有已配置的 locale。用不带选项的 locale 命令查看当前 Shell 中活动的 locale。用 locale -m 命令查看locale系统支持的所有可用的字符集编码。

当 locale 为 "" 时,根据环境的设置来设定 locale,为了使程序可以根据环境来改变活动 locale,一般都在程序的初始化阶段加入下面代码:setlocale(LC_ALL, "")。

当 locale 为 NULL 时,函数只做取回当前 locale 操作,通过返回值传出,并不改变当前 locale。



悲哀的程序员

我一直在windows下编程,保存的文件内容,直接使用了wchar_t, 也就是一个字符使用两个字节。导致两个问题:

  •   英文内容,太占用空间;
  •   windows下保存的wchar_t类型字符串,在Linux平台使用wchar_t作为默认内存空间直接读取有问题。linux下使用的是UTF-32,4个字节(我这种小气鬼,心痛死我了)

解决的两种办法:

  1. 依旧使用UCS-16保存,但在linux下要读取后转换为内存的UCS-32格式,同时注意大小端问题;
  2. 统一使用UTF-8、或者GBK保存,不同平台读取后再转换特定平台实现的wchar_t。


注: 还未整理完成。

目标:  整理出各编码体系定义。

              各编码体系如何转换。

              编码体系的编码方式(编码的存放形式??)


参考文献:

http://tech.sina.com.cn/s/2001-07-26/1850.html

http://zhidao.baidu.com/question/285081608.html

http://www.cnblogs.com/hnrainll/archive/2011/05/07/2039700.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值