Unicode与ANSI字符转换

上一篇 / 下一篇  2008-11-18 16:22:32 / 个人分类:Windows编程相关

  windows操作系统本身是基于Unicode编码的,而且API函数也是接受的Unicode-16编码的字符,所以,有时候我们经常在Unicode与其他编码的字符之间进行转换(貌似很多的windows函数都是有两个版本的,像CreateWindowEx(),其中CreateWindowExA()接受的是ANSIN字符串,而CreateWindowExW()接受Unicode字符串)。我们可以用MultiByteToWideChar()和WideCharToMultiByte()在Unicode与其他编码的字符串之间进行转换。

  int MultiByteToWideChar(
  UINT CodePage, //代码页,具体意思不清楚,不过如果是ANSI的话一般用CP_ACP
  DWORD dwFlags, //我们一般不使用这个参数,一般传递0        
  LPCSTR lpMultiByteStr, //指定要转换的字符串
  int cbMultiByte,       //指定字符串字节书数,如果为-1,函数便可自动判断源字符串长度
  LPWSTR lpWideCharStr,  //转换后字符串要写入的缓冲区的地址
  int cchWideChar        //指定缓冲区大小(字符数),如果为0,则函数不转换,而是返回宽字符数
  );                     //(包括终止字符'\0')。

   一般按照以下步骤将一个多字节字符串转换成Unicode形式:
   (1)调用MultiByteToWideChar,为lpWideCharStr传入NULL,cchWideChar传入0,为cbMultiByte
    传入-1.
    (2) 分配一块内存,他的大小是上一个MultiByteToWideChar返回值乘以sizeof(wchar_t)。
    (3) 再次调用MultiByteToWideChar,将分配的内存传入lpWideCharStr,cchWideChar为第二步
        计算的值。
    (4) 使用转换后的字符串。
    (5) 释放Unicode字符串占用的内存块。

  如果要将Unicode字符串转换为多字节字符串,可以使用WideCharToMultiByte:

  int WideCharToMultiByte(
  UINT CodePage,
  DWORD dwFlags,
  LPCWSTR lpWideCharStr,
  int cchWideChar,
  LPSTR lpMultiByteStr,
  int cbMultiByte,
  LPCSTR lpDefaultChar,   
  LPBOOL lpUsedDefaultChar
  );

  将Unicode转换成多字节字符串的步骤跟上面差不多,只是在第二步时不用做乘法运算。最后两个参数是在字符在CodePage指定的代码页中没有相应的表示的时候,才使用这两个参数。


TAG: Windows编程相关

 

评分:0

我来说两句

Open Toolbar