编码格式unicode,实现字符的unicode编码方式与windows

  编码格式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

  }

编码格式unicode,实现字符的unicode编码方式与windows