编码格式unicode,实现字符的unicode编码方式与windows
Unicode:宽字节字符集
1.如何获取既包含单字节字符又包含双字节字符的字符串中的字符数?
您可以调用包含Microsoft Visual C #的function _mbslen的运行时库来操作多字节(单字节和双字节)字符串。
你无法通过调用strlen函数真正知道一个字符串有多少个字符,它只能告诉你在到达0结尾之前有多少个字节。
PTSTR char next(LPCTSTR);返回字符串中下一个字符的地址。
PTSTR CharPrev ( LPCTSTR,LPCTSTR);返回字符串中前一个字符的地址。
BOOL IsDBCSLeadByte(字节);如果这个字节是DBCS字符的第一个字节,则返回一个非零值。
(1)不同语言之间的数据交换很容易。
(2)使您能够分配单个二进制文件。支持所有语言的exe文件或DLL文件。
(3)提高应用程序的运行效率。
Windows 2000是使用Unicode从头开始开发的。如果您调用任何Windows函数并向其传递ANSI字符串,系统将首先将该字符串转换为Unicode,然后将该Unicode字符串传递给操作系统。如果您希望函数返回ANSI字符串,系统将首先将Unicode字符串转换为ANSI字符串,然后将结果返回给您的应用程序。转换这些字符串需要时间和系统内存。通过从头开始使用Unicode开发应用程序,您可以使应用程序更有效地运行。
Windows CE本身就是使用Unicode的操作系统,根本不支持ANSI Windows功能。
Windows 98只支持ANSI,只能为ANSI开发应用程序。
当Microsoft将COM从16位Windows转换到Win32时,公司决定所有需要字符串的COM接口方法只能接受Unicode字符串。
4.Unicode源代码怎么写?
微软为Unicode设计了WindowsAPI,可以将代码的影响降到最低。事实上,您可以编写一个源代码文件,用或不用Unicode来编译它。您只需要定义两个宏(UNICODE和_UNICODE)来修改和重新编译源文件。
_UNICODE宏用于C运行时头文件,而UNICODE宏用于Windows头文件。编译源代码模块时,通常需要同时定义两个宏。
指向常量Unicode字符串的指针。
的ANSI数据类型为CHAR、LPSTR和LPCSTR。
ANSI/Unicode的通用数据类型有TCHAR、PTSTR、LPCTSTR。
MBCS运算函数以_mbs _mbscpy开头
ANSI/Unicode操作函数以_tcs _tcscpy(C运行时库)开始
ANSI/Unicode操作函数以lstr lstrcpy开始(Windows函数)
在Windows2000中,所有新的和未过时的函数都有ANSI和Unicode版本。ANSI版本函数的结束由A表示;Unicode函数的结尾用W表示.窗口将被定义如下:
#ifdef UNICODE
#定义CreateWindowEx CreateWindowExW
#否则
#定义CreateWindowEx CreateWindowExA
#endif //!采用双字节对字符进行编码
Unicode L "字符串"
Ansi/ANSI/Unicode T("string ")或_ text(" string ")if(SZ error[0]==_ text( j ){ }
8.为什么要尽量使用操作系统功能?
这将有助于略微提高应用程序的运行性能,因为操作系统字符串函数经常被大型应用程序使用,例如操作系统的shell进程Explorer.exe。因为这些函数被广泛使用,所以它们可能已经在应用程序运行时被加载到RAM中。
如StrCat、StrChr、StrCmp和StrCpy等。
9.如何编写ANSI和Unicode兼容的应用程序?
(1)将文本字符串视为字符数组,而不是字符数组或字节数组。
(2)对文本字符和字符串使用通用数据类型(如TCHAR和PTSTR)。
(3)对字节、字节指针和数据缓存使用显式数据类型(如BYTE和PBYTE)。
(4)对文字字符和字符串使用文本宏。
(5)执行全局替换(例如,用PTSTR替换PSTR)。
(6)修改字符串操作问题。例如,函数通常希望以字符而不是字节来传递缓存大小。这意味着您应该传递(sizeof(szBuffer)/sizeof(TCHAR),而不是传递sizeof(szBuffer)。另外,如果你需要为一个字符串分配一个内存块,并且有字符串中的字符数,记得按字节分配内存。也就是说,应该调用malloc(nCharacters * sizeof(tchar))而不是malloc(nCharacters)。
NORM_IGNORECASE忽略字母的大小写。
NORM_IGNOREKANATYPE不区分平假名字符和片假名字符。
NORM_IGNORENONSPACE忽略非空格字符。
NORM_IGNORESYMBOLS忽略符号
NORM_IGNOREWIDTH不区分单字节字符和与双字节字符相同的字符。
SORT_STRINGSORT将标点符号视为普通符号。
11.如何辨别一个文本文件是ANSI还是Unicode?
如果文本文件的前两个字节是0xFF和0xFE,则为Unicode,否则为ANSI。
12.如何判断一个字符串是ANSI还是Unicode?
用IsTextUnicode来判断。IsTextUnicode使用一系列统计方法和定性方法来猜测缓存的内容。由于这不是一个精确的科学方法,IsTextUnicode可能会返回不正确的结果。
13.如何在Unicode和ANSI之间转换字符串?
Windows MultiByteToWideChar函数用于将多字节字符串转换为宽字符串;WideCharToMultiByte函数将宽字符串转换为等效的多字节字符串。
char*缓冲区;
int size=:WideCharToMultiByte(CP _ ACP,0,src,-1,NULL,0,NULL,NULL);
//空终止的wchar缓冲区
buffer=new char[size];
int ret=:WideCharToMultiByte(CP _ ACP,NULL,src,-1,buffer,size 1,NULL,NULL);
if (*dest!=0)
删除* dest
*dest=缓冲区;
返回ret
int length=strlen(src);//空终止缓冲区
WCHAR * buffer=new WCHAR[长度1];//WCHAR表示无符号短整型,2字节
//为Unicodes提供足够的缓冲区大小
int ret=:MultiByteToWideChar(CP _ ACP,MB_PRECOMPOSED,src,length,buffer,length);
缓冲区[ret]=0;
if (*dest!=0)
删除* dest
*dest=缓冲区;
返回ret
}