Unicode

来源:互联网 发布:json get post 编辑:程序博客网 时间:2024/04/25 17:38

 参考《Windows核心编程》。

1.       Unicode 提供了一种简单而又一致的表达字符串的方法。Unicode字符串中所有字符都是16位的(两个字节)。

 

2.      使用Unicode的好处:

1)      可以很容易地在不同语言之间进行数据交换。

2)      使你能够分配支持所有语言的单个二进制.exeDLL文件

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 就会扩展为ANSIstrcat 函数。但是如果定义了_UNICODE, _ tcscat将扩展为UNICODE  wcscat 函数。拥有字符串参数的所有C运行期函数都在TChar.h文件中定义了一个通用宏。如果使用通用宏,而不是ANSI/ UNICODE  的特定函数名,就能够顺利地创建可以为ANSIUNICODE  进行编译的源代码。

 

另一个通用的宏_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而定。例如,如果没有定义UNICODElstrcat函数将扩展为lstrcatA。如果定义了UNICODElstrcat将扩展为lstrcatW

 

5.    通用于ANSIUNICODE的程序

1) 将文本串视为字符数组,而不是chars数组或字节数组。

2) 将通用数据类型(如TCHARPTSTR)用于文本字符和字符串。

3) 将显式数据类型(如BYTEPBYTE)用于字节、字节指针和数据缓存.

补充: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.  ANSIUNICODE的程序之间转换字符串

Ø  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);

}

 

 

 

 

         

 

 

 

 

 

 

原创粉丝点击