如何同时提供ANSI和UNICODE函数

2024-02-22 12:18
文章标签 函数 提供 unicode ansi

本文主要是介绍如何同时提供ANSI和UNICODE函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

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

[cpp]  view plain copy
  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 plain copy
  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

这篇关于如何同时提供ANSI和UNICODE函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/735231

相关文章

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

Unity3D 运动之Move函数和translate

CharacterController.Move 移动 function Move (motion : Vector3) : CollisionFlags Description描述 A more complex move function taking absolute movement deltas. 一个更加复杂的运动函数,每次都绝对运动。 Attempts to

✨机器学习笔记(二)—— 线性回归、代价函数、梯度下降

1️⃣线性回归(linear regression) f w , b ( x ) = w x + b f_{w,b}(x) = wx + b fw,b​(x)=wx+b 🎈A linear regression model predicting house prices: 如图是机器学习通过监督学习运用线性回归模型来预测房价的例子,当房屋大小为1250 f e e t 2 feet^

JavaSE(十三)——函数式编程(Lambda表达式、方法引用、Stream流)

函数式编程 函数式编程 是 Java 8 引入的一个重要特性,它允许开发者以函数作为一等公民(first-class citizens)的方式编程,即函数可以作为参数传递给其他函数,也可以作为返回值。 这极大地提高了代码的可读性、可维护性和复用性。函数式编程的核心概念包括高阶函数、Lambda 表达式、函数式接口、流(Streams)和 Optional 类等。 函数式编程的核心是Lambda