Windows下的UNICODE、非UNICODE程序

UNICODE程序指的是编译时定义了_UNICODE宏的程序,相应的,编译时没定义_UNICODE宏的程序叫非UNICODE程序。要开发两种程序,visual studio C++ .net就是“Character Set”设置上的不同:
unicode-vc.jpg

UNICODE、非UNICODE程序使用的字符编码
UNICODE程序使用的字符编码很直观,就是UNICODE码。那么非UNICODE程序使用何样编码?
非UNICODE程序使用字符编码
  • ASCII字符:ASCII码。
  • 非ASCII字符:正使用地区码。像中文(简体,中国)就是GB2312;中文(繁体,台湾)是BIG5。


地区码:这个概念是我为叙述方便而使用的,用它来区别像UNICODE、UTF-8这类统一码。GB2312,它的码表中字符绝大多数是简体中文,对其它文字,像阿拉伯文就无能为力了。但UNICODE、UTF-8,既包含简体中文也包含阿拉伯文,它们的码表包括了世界在用的所有字符。

哪里设置地区码
在任一时刻,操作系统只允许存在一种地区码。要察看、更改地区码,Win7下是“控制面版”——“区域和语言”——“管理”
unicode.jpg 
上图表示地区码是GB2312(中文(简体,中国),“更改系统区域设置”可以更改地区码。

地区码如何影响非UNICODE程序
让来看一个调用SHGetFolderPath例子。my_documents_path变量存储了返回的目录,目录名是D:\用户目录\Documents
地区码是GB2312时
SHGetFolderPath-gb2312.jpg
地区码是BIG5时
注意当中“户”、“录”被置了“?”字符。这是由于BIG5中没有收录“户”、“录”字符,于是就被用一个“?”进行替代。
SHGetFolderPath-big5.jpg
为说明更完全,让看UNICODE程序中SHGetFolderPath的返回值。会发现当中全被用了UNICODE码。
SHGetFolderPath-unicode.jpg 

非UNICODE程序的死结
Microsoft宣传Windows XP/7时使用“完全”支持UNICODE,指的就是操作系统内部“完美”地用UNICODE码表示了“所有”字符串。所以虽然BIG5没有收录“户”、“录”字符,即使你还是硬把地区码设为BIG5,操作系统自带的资源管理器却仍旧能很好地显示“D:\用户目录\Documents”这串字符,因为资源管理器是UNICODE程序,UNICODE码表中是收录了“户”和“录”。

再来看非UNICODE程序,由于地区码少收录字符,操作系统叫它转换(从UNICODE到地区码)一些字符时它没有,那些没有的就被替换为“?”。很明显,接下程序如果继续用my_documents_path这个已是错了字符串时,那些访问都将出错。

非UNICODE程序的死结就是PC中存在地区码未收录字符。但一台PC怎么可能尽是“你”收录的字符呢。

要解决死结,UNICODE程序是趋势。但很可惜,基于各式各样原因,像程序要跨平台,在条件不具备情况下又只能是非UNIOCDE程序。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值