字符集、编码和字体

三个基本概念
--------------------------------------------
要在计算机上读取、保存、书写和显示文字,涉及到三个基本概念。

1. 字符集
字符集可以说是一个抽象的概念,就是所有文字的集合,然后每个字都有一个独一无二的编号。下面讲的编码,其实就是对字符集中的字符、在其书写、现实和存取过程中的具体编码方法。两者不同,但实际上经常有人直接用编码来表示字符集和编码两者。比如unicode,本身是一个字符集,就是相当于用2个字节,即最多65535个编号来表示所有的字符。 (另,由于65535个编号表示各种语言,还远远不够,所以UNICODE 4.0又增加了2个字节,所以unicode字符实际上有4个字节表示一个字符)。 注意这里并没有规定在具体实现中用2个字节来存储的问题,因为字符集不涉及到实现的问题。而基于Unicode字符集的UTF-16编码方法就是直接用2个字节来表示它,所以很多人把unicode和UTF-16混为一谈。

2. 编码
编码是一个实际的概念,就是字符集中的字符在计算机中如何用字节表示出来。比如对于unicode字符集,就用UTF-8、UTF-16、UTF-16 Little Endian以及UTF-32等多种编码方法。比如UTF-8,能够灵活表达unicode字符,有些用1个字节即可,有些用2个字节,甚至还有用更多字节的。

3. 字体
字节是用来显示文字的,计算机拿到字符后,要将其显示出来,即需要用字体,比如宋体等。如果选用的字体中没有对应某个字符的字体,则有可能显示乱码。所以要将文字正确显示出来,不仅编码方法要正确,字体也要支持才行。

软件开发中文字操作的编码问题
-------------------------------------------------

1. 代码中的常量字符串定义

比如代码中定义const char * city = "深圳",那么这里的编码方法就涉及到用了几个字节,字符编码ID是什么(这个实际上是字符集的问题,这里不再具体细分,统一用编码概念)。那么这个字符串常量用的倒底是什么编码呢?

答案应该是你目前正在使用的文本编辑器或者IDE的设定编码方法,你如果要在别的地方显示它,最好也要用相应的编码。

2. 读写文件的字符编码问题

当创建文件时,可以使用libc的函数:
FILE * fopen(const char * filename, const char * mode);
其中的mode中就可以指定该文件的文本编码方法,比如utf-8等,如果该文件时新建的,则该文件BOM上会指定该编码方法,如果该文件存在,现在仅仅是打开文件而已,则编码方法的参数会被忽略。
记得,上面的参数只是在文件头部设定了编码方法,但实际上你如果写入其他编码方法的文本,在后续显示时,会被用文件指定编码方法进行解码,可能会显示乱码。程序不会在两种编码之间进行自动转换,一般会有类似于mbstowcs()之类的函数进行手动转化。

文本文件头部可以有一个字段BOM(Byte order mark),来说明编码的不同。

3. 软件UI运行中的字符输入和显示

软件采用什么编码方法,需要使用setLocale()函数指定,当然如果不指定,也会有默认的locale。
char *setLocale(int category, const char *locale)
第一个参数category表明你要改变locale的哪一部份,如果是LC_ALL,就是全部修改。
第二个参数locale则是字符串常量,来表示具体的设置,常见的用"C"或者"da_DK"等。如果该参数为"",则使用当前环境变量的值,如果为NULL,则该函数只是查询,返回locale。
一般主程序启动后,"C" locale会被默认选定。


实际开发中遇到的问题
------------------------------------------------------------
1. 问题:HHM从SCE拿到韩文版本的结果文件,在个别机器的HHM上显示乱码,但用文本编辑器打开原始文件显示正常

首先来看整个显示的过程:
(1)结果文件是文本文件,里面包含了它的编码格式M1(在头部的BOM上);
(2)在HHM的代码中,打开该文件,并读取里面的数据并显示,假设HHM运行中的文本编码M2(注意M2和开发HHM时的文本编辑器编码M3,也就是里面字符串常量的编码,并不相同),则HHM用M2来解码M1的文字;
(3)HHM最终显示的时候,还需要用选定的字体来真正显示文本。

然后分析该问题,在其他机器均可以显示原有的韩文结果文件,那么说明HHM中M2应该和M1一样,而问题机器上的文本编辑器也能显示该文件,说明M2编码在该机器上也支持。那么问题就出在上面说的第3步,就是HHM选定的字体不支持韩文。

后来修改HHM的字体,韩文可以正常显示,问题解决。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值