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 宏。