Unicode 和ANSI字符串转换(引用自Windows内核编程(第五版 ))

来源:互联网 发布:游戏多开软件 编辑:程序博客网 时间:2024/05/20 01:46

     在日常的编程中我们经常会遇到使用别人封装好的库,但是他们的库关于字符串的操作很多是基于ANSI来封装的,这就造成了我们在创建 的Unicode的工程在使用的时候有很多不方便,如果没有这些库的源码来做修改的情况下,我们只能考虑Unicode 和ANSI字符串转换相互转换来满足自己特殊情况的应用;

   废话少说,下面直接介绍Unicode 和ANSI字符串转换的方法:

1.多字节 字符串转换为宽字符 字符串(MultiByteToWideChar)

         MultiByteToWideChar的函数原型如下:

          int MultiByteToWideChar(
    UINT CodePage,
    DWORD dwFlags,
    LPCSTR lpMultiByteStr,
    int cchMultiByte,
    LPWSTR lpWideCharStr,
    int cchWideChar);

        转换的步骤为:

        使用的一般步骤如下:
  MultiByteToWideChar:
  1)调用MultiByteToWideChar,为lpWideCharStr参数传入NULL,为cchWideChar参数传入0,为cchMultiByte参数传入-1;
  2)分配一块足够容纳转换后Unicode字符串的内存,它的大小是上一个MultiByteToWideChar调用的返回值乘以sizeof(wchar_t);
  3)再次调用MultiByteToWideChar,这一次将缓冲区地址作为lpWideCharStr参数的值传入,将第一次MultiByteToWideChar调用的返回值乘以sizeof(wchar_t) 后得到的大小的作为cchWideChar参数的值传入;
  4)使用转换后的字符串;
  5)释放Unicode字符串占用的内存块。


2.宽字符 字符串 转换为 多字节 字符串(WideCharToMultiByte)

       先来看一下WideChatToMultiByte的定义:

         int WideCharToMultiByte(
    UINT CodePage,
    DWORD dwFlags,
    LPWSTR lpWideCharStr,
    int cchWideChar,
    LPCSTR lpMultiByteStr,
    int cchMultiByte,
    LPCSTR lpDefaultChar,
    PBOOL pfUsedDefaultChar );

       这个函数和MultiByteToWideChar的操作步骤是一样的,唯一的不同就是:返回值直接就是确保转换成功所需的字节数,所以无需执行乘法运算。

           注意:WideCharToMultiByte比MultiByteToWideChar相比多两个参数lpDefaultChar和pfUsedDefaultChar,这两个参数只有在以下情况下才会用到:  当一个字符在uCodePage指定的代码页中没有对应的表示是,才会用到这两个参数;

           当遇到一个不能转换的宽字符时,pDefaultChar指定的字符便被用来替代不能转换的宽字符的字符;如果pDefault指定为NULL,函数会使用一个系统默认的字符,一般情况下为问号,这对文件明来说是比较危险的,因为问号是一个通配符;

           pfUsedDefaultChar指向一个布尔变量,如果宽字符转换过程中,有至少一个字符不能转换为对应的多字节形式,这个函数会被置为TRUE,如果全部成功转换则 返回FALSE;可以用来验证转换是否顺利完成,当然一般情况下我们也会将该参数直接传入NULL;

      

 



0 0
原创粉丝点击