异想天开

What's the true meaning of light, Could you tell me why

字符编码问题

日期:2014-06-17 11:32:27
  
最后更新日期:2015-07-23 18:03:25
【技术文章,非码农勿入】
参考:
1.http://www.regexlab.com/zh/encoding.htm

这次处理汉字编码又遇到个小问题,其实是软件编码处理引起的问题,在linux下用vim编辑文件(locale为utf8),然后下载到windows的source insight编辑,最后再上传到linux环境编译,导致编译报错。原因就是source insight会将文件转化为本地编码格式,而源代码里面有宽字符常量。最后解决是用notepad++转化为utf8格式,并只用notepad++来编辑该文件。
1.以史鉴今-字符与编码的发展 从计算机对多国语言的支持角度看,大致可以分为三个阶段:
系统内码 说明 系统
阶段一 ASCII 计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。 英文 DOS
阶段二 ANSI编码
(本地化)
为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。

不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。
中文 DOS,中文 Windows 95/98,日文 Windows 95/98
阶段三 UNICODE
(国际化)
为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。 Windows NT/2000/XP,Linux,Java

注:该历史摘自参考1,这段历史对理解字符编码问题很有用的

2.ANSI编码与UNICODE之间的相互转化
C语言库提供这层转换的接口,如
wctomb = wide character to multibyte
mbtowc = multibyte  to wide character
还包括其它格式的转换函数,具体请google。
ANSI编码与UNICODE之间的相互转化,记得设置本地locale,而本地locale即操作系统目前的locale。不要利用更改locale来转化不同格式的编码,比如将windows下的GBK编码转化为UTF8编码,妄想利用下面两步:
a).设置locale为gbk,将gbk转化为unicode
b).设置locale为utf8,将unicode转为utf8
不同编码的转化,需使用编码转换库。