Unicode
来源:互联网 发布:json get post 编辑:程序博客网 时间:2024/04/25 17:38
参考《Windows核心编程》。
1. Unicode 提供了一种简单而又一致的表达字符串的方法。Unicode字符串中所有字符都是16位的(两个字节)。
2. 使用Unicode的好处:
1) 可以很容易地在不同语言之间进行数据交换。
2) 使你能够分配支持所有语言的单个二进制.exe或DLL文件
3) 提高应用程序的运行效率。
3. C运行期库对Unicode的支持和Windows对于Unicode的支持
1) C运行期库对Unicode的支持
TCHAR.H
_UNICODE not defined
_UNICODE defined
_tcscat
strcat
wcscat
_tcscpy
strcpy
wcscpy
请注意, 所有的Unicode函数均以wcs开头, wcs是宽字符串的英文缩写。若要调用Unicode函数,只需要前缀wcs来取代ANSI字符串函数的前缀str即可。
若要建立双重功能,必须包含TChar.h文件,而不是包含String.h文件。
在TChar.h中有一个宏称为_ tcscat, 如果在包含该头文件时没有定义_UNICODE ,那么_tcscat 就会扩展为ANSI的strcat 函数。但是如果定义了_UNICODE, _ tcscat将扩展为UNICODE 的wcscat 函数。拥有字符串参数的所有C运行期函数都在TChar.h文件中定义了一个通用宏。如果使用通用宏,而不是ANSI/ UNICODE 的特定函数名,就能够顺利地创建可以为ANSI或UNICODE 进行编译的源代码。
另一个通用的宏_TEXT, _TEXT宏也在TChar.h文件中做了定义。如果定义了_UNICODE ,那么_TEXT定义为下面的形式:
#define _TEXT(x) L ## x
如果没有定义_UNICODE ,_TEXT将定义为:
#define _TEXT(x) x
这样无论是否定义了UNICODE都能顺利编译过去。
补充下:
#ifdef UNICODE
typedef WCHAR TCHAR;
#else
typedef char TCHAR;
#endif
例如:TCHAR *szName = _TEXT(“unicode”);
也支持字符串:
If (szName[0] == _TEXT(‘u’)) {}
Else {}
2) Windows对于Unicode的支持
通用数据类型
UNICODE not defined
UNICODE defined
PTSTR
PWSTR
PSTR
请注意,这里的UNICODE 宏没有前置的下划线。_UNICODE 宏用于C运行期头文而UNICODE 宏则用于Windows头文件。当编译源代码模块时,通常必须同时定义这两个宏。
4. Windows 对于字符串的支持
函数 描述 lstrcat This function appends one string to another. lstrcmp Compares two character strings. The comparison is case-sensitive. lstrcmpi Compares two character strings. The comparison is not case-sensitive. lstrcpy This function copies a string to a buffer.
这些函数是作为宏来实现的,这些宏既可以调用函数的UNICODE版本,也可以调用函数的ANSI版本,这要根据编译源代码模块时是否已经定义了UNICODE而定。例如,如果没有定义UNICODE,lstrcat函数将扩展为lstrcatA。如果定义了UNICODE,lstrcat将扩展为lstrcatW。
5. 通用于ANSI和UNICODE的程序
1) 将文本串视为字符数组,而不是chars数组或字节数组。
2) 将通用数据类型(如TCHAR和PTSTR)用于文本字符和字符串。
3) 将显式数据类型(如BYTE和PBYTE)用于字节、字节指针和数据缓存.
补充:Byte (8 bits). PBYPE, Pointer to a BYTE.
4) 将TEXT宏用于原义字符和字符串。
5) 执行全局性替换(例如用PTSTR替换PSTR)
6) 修改字符串运算问题
补充:函数通常希望你在字符中传递一个缓存的大小,而不是字节。这意味着你不应该传
递sizeof ( szBuffer ) ,而应该传递(sizeof ( szBuffer ) / sizeof ( TCHAR )。另外,如果需要为字
符串分配一个内存块,并且拥有该字符串中的字符数目,那么请记住要按字节来分配内存。
这就是说,应该调用malloc(nCharacters *sizeof(TCHAR)), 而不是调用malloc(nCharacters).。
6. ANSI和UNICODE的程序之间转换字符串
Ø MultiByteToWideChar用法详解
int MultiByteToWideChar
(
UINT CodePage, // code page
DWORD dwFlags, // character-type options
LPCSTR lpMultiByteStr, // string to map
int cbMultiByte, // number of bytes in string
LPWSTR lpWideCharStr, // wide-character buffer
int cchWideChar // size of buffer
);
void MByteToWChar(UINT codePage, const std::string &strMulti, std::wstring &strWide)
{
int targetLen = MultiByteToWideChar(codePage, 0, strMulti.data(), -1, NULL, 0);
strWide.resize(targetLen/sizeof(wchar_t));
MultiByteToWideChar(codePage, 0, strMulti.data(), -1, (LPWSTR)strWide.data(), targetLen);
}
Int WideCharToMultiByte ( __in UINT CodePage, __in DWORD dwFlags, __in_ecount(cchWideChar) LPCWSTR lpWideCharStr, __in int cchWideChar, __out_bcount_opt(cbMultiByte) __transfer(lpWideCharStr) LPSTR lpMultiByteStr, __in int cbMultiByte, __in_opt LPCSTR lpDefaultChar, __out_opt LPBOOL lpUsedDefaultChar); WCharToMByte(UINT codePage, const std::wstring &wStr, std::string& mStr) { int targetLen = WideCharToMultiByte(codePage, 0, wStr.data(), -1, NULL, 0, NULL, NULL); mStr.resize(targetLen-1); WideCharToMultiByte(codePage, 0, wStr.data(), (int)wStr.size(), (LPSTR)mStr.data(), targetLen,NULL,NULL); }
- Unicode
- Unicode
- unicode
- Unicode
- Unicode
- Unicode
- unicode
- UNICODE
- unicode
- Unicode
- unicode
- Unicode
- Unicode
- Unicode
- Unicode
- Unicode
- Unicode
- Unicode
- How do I get multiple process to log to the same file?
- SPARQL: Web 2.0 Meet the Semantic Web
- 修改svn的url
- Windows登录类型及安全日志解析
- S3c2440A平台HIVE注册表+binfs地完成
- Unicode
- 教育孩子法宝
- Hibernate框架ORM的实现原理(资料)
- js去除所有的空格
- 关于DB2恢复时候不能停止前滚的问题
- C++STL快速熟悉
- 如何在同一张数据库表上两次施加左联接(left outer join)!
- 那些花儿
- 用mysql作openldap的后台数据库