zoukankan      html  css  js  c++  java
  • 如何同时提供ANSI和UNICODE函数

        继前两篇文章之后,我们更加关心的问题是,我们可能为了方便他人的使用,需要提供ANSI和UNICODE版本的函数,此时,我们可以模

    仿 Windows的作法,我们只编写UNICODE版本的函数,然后在ANSI版本的函数中,我们把多字符转换成UNICODE字符串,然后调用UNICODE版

     的函数,完成之后,再把他还原成多字符集的字符串。

       此处,引用示例,逆转字符串中所有字符的函数:

     

    [cpp] view plaincopy
     
    1. BOOL StringReverseW(PWSTR pWideCharStr, DWORD cchLength)  
    2. {  
    3.     PWSTR pEndOfStr = pWideCharStr + wcsnlen_s(pWideCharStr, cchLength) - 1;  
    4.     wchar_t cCharT;  
    5.     while(pWideCharStr < pEndOfStr)  
    6.     {  
    7.         //保存到一个临时变量中  
    8.         cCharT = *pWideCharStr;  
    9.         //把最后一个字符放进第一个字符中  
    10.         *pWideCharStr = *pEndOfStr;  
    11.         //把临时变量放进最后一个字符中  
    12.         *pEndOfStr = cCharT;  
    13.         //想左移动一个字符位置  
    14.         pWideCharStr++;  
    15.         //向右移动一个字符位置  
    16.         pEndOfStr--;  
    17.     }  
    18.     return TRUE;  
    19. }  
    20. BOOL StringReverseA(PSTR pMultiByteStr, DWORD cchLength)  
    21. {  
    22.     PWSTR pWideCharStr;  
    23.     int   nLenOfWideCharStr;  
    24.     BOOL  fOk = FALSE;  
    25.     //获取需要转换字符串的大小  
    26.     nLenOfWideCharStr = MultiByteToWideChar(CP_ACP, 0,  
    27.         pMultiByteStr, cchLength, NULL, 0);  
    28.     //为字符串分配内存  
    29.     pWideCharStr = (PWSTR)HeapAlloc(GetProcessHeap(), 0,   
    30.         nLenOfWideCharStr * sizeof(wchar_t));  
    31.     if (NULL == pWideCharStr)  
    32.     {  
    33.         return fOk;  
    34.     }  
    35.     //转换成宽字符pWideCharStr  
    36.     MultiByteToWideChar(CP_ACP, 0, pMultiByteStr, cchLength,  
    37.         pWideCharStr, nLenOfWideCharStr);  
    38.     //使用宽字符函数进行处理  
    39.     fOk = StringReverseW(pWideCharStr, cchLength);  
    40.     if (fOk)  
    41.     {  
    42.         //转换为多字符  
    43.         WideCharToMultiByte(CP_ACP, 0, pWideCharStr, cchLength,  
    44.             pMultiByteStr, (int)strlen(pMultiByteStr), NULL, NULL);  
    45.     }  
    46.     //释放内存  
    47.     HeapFree(GetProcessHeap(), 0, pWideCharStr);  
    48.     return fOk;  
    49. }  

    然后,我们可以在发布的.h头文件中,这样定义函数:

     

    [cpp] view plaincopy
     
    1. BOOL StringReverseW(PWSTR pWideCharStr, DWORD cchLength)  
    2. BOOL StringReverseA(PSTR pMultiByteStr, DWORD cchLength)  
    3. #ifdef UNICODE  
    4. #define StringReverse StringReverseW  
    5. #else  
    6. #define StringReverse StringReverseA  
    7. #endif  

    这样,使用我们函数的人,也就不用再为是否是UNICODE或是ANSI而焦头烂额了。

     

    同系列文章参看:

     

    《多字符集(ANSI)和UNICODE及字符串处理方式准则》

     

     UNICODE和ANSI字符串的转换  

    原文地址:

    http://blog.csdn.net/blpluto/article/details/5755358

  • 相关阅读:
    Vuejs之Component slot 插槽详解
    ASP.NET MVC生命周期与管道模型
    Unity IoC Base On MVC
    轻量级IoC框架Ninject.NET搭建
    原创【前端控件】之日历控件
    出现了内部错误-网站中X509Certificate2加载证书时出错
    windows service 1053错误 启动失败
    关于浏览器Number.toFixed的错误修复
    vue中用mock制造模拟接口(本文主要解决坑),一定要看完哦
    ubuntu开发项目不能执行热更新
  • 原文地址:https://www.cnblogs.com/sunylat/p/6119131.html
Copyright © 2011-2022 走看看