Unicode编码

什么是Unicode编码

Unicode(中文:万国码、国际码、统一码、单一码)是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得计算机可以用更为简单的方式来呈现和处理文字。

Unicode伴随着通用字符集的标准而发展,同时也以书本的形式[1]对外发表。Unicode至今仍在不断增修,每个新版本都加入更多新的字符。目前最新的版本为第六版,已收入了超过十万个字符(第十万个字符在2005年获采纳)。Unicode涵盖的数据除了视觉上的字形、编码方法、标准的字符编码外,还包含了字符特性,如大小写字母。

Unicode发展由非营利机构统一码联盟负责,该机构致力于让Unicode方案取代既有的字符编码方案。因为既有的方案往往空间非常有限,亦不适用于多语环境。

Unicode备受认可,并广泛地应用于计算机软件的国际化与本地化过程。有很多新科技,如可扩展置标语言、Java编程语言以及现代的操作系统,都采用Unicode编码。


为什么用Unicode编码

1) Unicode使程序的本地化变得更容易。

2) 使用Unicode,只需发布一个二进制(.exe或DLL)文件,即可支持所有语言。

3) Unicode提升了应用程序的效率,因为代码执行速度更快,占用内存更少。Windows内部的一切工作都是使用Unicode字符和字符串来进行的。 所以,假如你非要传入ANSI字符或字符串,Windows就会被迫分配内存,并将ANSI字符或字符串转换为等价的Unicode形式。

4) 使用Unicode,你的应用程序能轻松调用所有不反对使用(nondeprecated)的Windows函数,因为一些Windows函数提供了只能处理Unicode字符和字符串的版本。

5) 使用Unicode,你的代码很容易与COM集成(后者要求使用Unicode字符和字符串)。

6) 使用Unicode,你的代码很容易与.NET Framework集成(后者要要求使用Unicode字符和字符串)。

7) 使用Unicode,能保证你的代码能够轻松操纵你自己的资源(其中的字符串总是Unicode的)。

8) 使用Unicode,只要一个EXE可执行文件,在界面上就可以正常显示所有的语言。

wchar_t : 是使用2个字节表示一个符号,最多表示2^16个字符,对于世界上现行使用的字符来说,使用wchar_t就能够全部表示出来。而char : 是使用一个字节表示的范围只有256,不能表达所有的字符。

对于Unicode 和 UTF-8 来说可以是等价的,两种编码都能够表示全世界所有的字符。区别在于UTF-8是可变长编码,在表示英文字母时只用了一个字节,这样大大的节省了存储空间。

9) 使用Unicode,只要一个EXE可执行文件,可以保证在不同语言环境下正常运行。

在韩文系统中的“\”与 英文中的“\”不是一样的。我们对于路径的处理时会用到strrchr(szbuffer, '\\'),然而在韩文系统中会不能正确的找到,导致我们的程序出现错误。如果使用Unicode的 _tcsrchr(szBuffer, _T('\\')),则能够让程序很好的运行。


如何使用UNICODE

1) 首先推荐的类型是TCHAR(通用字符类型)。当定义了_UNICODE宏的时候,TCHAR就是WCHAR,当没有定义这个宏的时候,TCHAR就是char,TCHAR的定义如下:

#ifdef UNICODE // r_winnt

typedef WCHAR TCHAR, *PTCHAR;

#else /* UNICODE */ // r_winnt

typedef char TCHAR, *PTCHAR;

#endif /* !_TCHAR_DEFINED */

通过TCHAR,只需要这样一段代码:

TCHAR tStr[] = _T("t code");

MessageBox(tStr);

就可以支持UNICODE和MULTIBYTE两种版本。_T宏的作用就是转换成TCHAR。

2) 关于其他的处理

首先是常用的CString,它本身就支持UNICODE。下面的例子说明了用法:

CString *pFileName = new CString("c://tmpfile.txt");

#ifdef _UNICODE

m_hFile = CreateFile(pFileName->AllocSysString(), GENERIC_READ |

GENERIC_WRITE, FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);

#else

m_hFile = CreateFile(pFileName->GetBuffer(pFileName->GetLength()),

GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL,

OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

#endif

3) 当我们在UNICODE方式中需要为一个字串常量附值时可以使用L宏,如:

BSTR wcsStr = L"unicode";

这样的附值很简便,但是,经过L宏处理后的字串一定是UNICODE,如果你吧它附给一个MULTIBYTE的字串,字符将可能会被截断。

另外,VC还提供了一些函数如WideCharToMultiByte和MultiByteToWideChar还有另外的一些宏来支持转换。

4) 编译器的设置:

在project->Property对话框中的“General”的页面,在“Character set”中选择“Use Unicode character set”完成项目Unicode设置。


Windows定义的Unicode数据类型

WCHAR Unicode字符

PWSTR 指向Unicode字符串的指针

PCWSTR 指向一个恒定的Unicode字符串的指针

对应的ANSI数据类型为CHAR,LPSTR和LPCSTR。

ANSI/Unicode通用数据类型为TCHAR,PTSTR,LPCTSTR。


如何对Unicode进行操作

ANSI 操作函数以str开头 strcpy

Unicode 操作函数以wcs开头 wcscpy

MBCS 操作函数以_mbs开头 _mbscpy

ANSI/Unicode 操作函数以_tcs开头 _tcscpy(C运行期库)

ANSI/Unicode 操作函数以lstr开头 lstrcpy(Windows函数)

所有新的和未过时的函数都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示;Unicode版本函数结尾以W表示。Windows会如下定义:

#ifdef UNICODE

#define CreateWindowEx CreateWindowExW

#else

#define CreateWindowEx CreateWindowExA

#endif // !UNICODE


Unicode字符串常量

ANSI "string"

Unicode L"string"

ANSI/Unicode _T("string") 或_TEXT("string") If( szError[0] == T(‘J') ){ }

推荐只使用_T 宏。


2014-06-03 18:00
我们的资质荣誉
2006年 中国共享软件最佳服务奖
2007年 优秀共享软件常青树奖
2010年 长沙创业明星企业

"用CCProxy上网行为管理,有效的控制非工作上网行为所带来的无形效益损失成本,如造成管理效率的下降、订单流失、意外事件的发生,以及对团队精神造成的不良影响,如纪律松散、组织效率低下、文化萧条等。"

-某知名电商公司CTO

"员工工作时间滥用网络行为不但会造成带宽紧张,影响到整个企业的运营,也可能随之给单位企业带来严重的信息网络安全稳患,如受到病毒、黑客攻击"

-某IT公司技术总监
成功案例
  • 中国妇女出版社
    西南政法大学
    小浪底建设管理局
    兴业银行上海分行
    美的集团
    西安喜来登大酒店
    云南省体育科研所
    九牧实业有限公司
  • 湖南女子职业大学
    长城证券有限公司
    乌鲁木齐市气象局
    民生银行石家庄分行
    无锡工艺职业学院
    农业银行四川分行
    乌鲁木齐市气象局
    民生银行石家庄分行
  • 烟台大学
    西南政法大学
    广东协和神学院
    环境管理干部学院
    小浪底建设管理局
    浙江可立思安制药
相关阅读