CStriUtils.h

#pragma once#include <wtypesbase.h>
#include <string>#ifdef _UNICODE
using _tstring = std::wstring;
#else
using _tstring = std::string;
#endifclass CStrUtils
{
public://其他编码字符串 转 中立字符串转换static _tstring WStrToTStr(const std::wstring& str);static _tstring AStrToTStr(const std::string& str);static _tstring U8StrToTStr(const std::string& str);//中立字符串 转 其他编码字符串static std::wstring TStrToWStr(const _tstring& tstr);static std::string TStrToAStr(const _tstring& tstr);static std::string TStrToU8Str(const _tstring& tstr);//Unicode 编码字符串 转 其他编码字符串static std::string WStrToAStr(const std::wstring& wstr);static std::string WStrToU8Str(const std::wstring& wstr);//Ansi 编码字符串 转 其他编码字符串static std::wstring AStrToWStr(const std::string& str);static std::string AStrToU8Str(const std::string& str);//Uft8 编码字符串 转 其他编码字符串static std::wstring U8StrToWStr(const std::string& str);static std::string U8StrToAStr(const std::string& str);//Unicode 编码字符串 转 其他编码字符串static LPSTR WToAPtr(LPCWSTR lpInStr);static BOOL WToABuf(LPCWSTR lpInStr, LPSTR lpOutStr, int cchOut);static LPSTR WToU8Ptr(LPCWSTR lpInStr);static BOOL WToUtf8Buf(LPCWSTR lpInStr, LPSTR lpOutStr, int cchOut);static BOOL WToTBuf(LPCWSTR lpInStr, LPTSTR lpOutStr, int cchOut);//Ansi 编码字符串 转 其他编码字符串static LPWSTR AToWPtr(LPCSTR lpInStr);static BOOL AToWBuf(LPCSTR lpInStr, LPWSTR lpOutStr, int cchOut);static LPSTR AToU8Ptr(LPCSTR lpInStr);static BOOL AToUtf8Buf(LPCSTR lpInStr, LPSTR lpOutStr, int cchOut);static BOOL AToTbuf(LPCSTR lpInStr, LPTSTR lpOutStr, int cchOut);//Uft8 编码字符串 转 其他编码字符串static LPWSTR U8ToWPtr(LPCSTR lpInStr);static BOOL U8ToWBuf(LPCSTR lpInStr, LPWSTR lpOutStr, int cchOut);static LPSTR U8ToAPtr(LPCSTR lpInStr);static BOOL U8ToABuf(LPCSTR lpInStr, LPSTR lpOutStr, int cchOut);static BOOL U8ToTbuf(LPCSTR lpInStr, LPTSTR lpOutStr, int cchOut);//释放static VOID FreePtr(LPWSTR& lpwStr);static VOID FreePtr(LPSTR& lpStr);private://宽字符转其他static LPSTR WToOtherPtr(UINT CodePage, LPCWSTR lpInStr);static BOOL WToOtherBuf(UINT CodePage, LPCWSTR lpInStr, LPSTR lpOutStr, int cchOut);static std::string WStrToOtherStr(UINT CodePage, const std::wstring& wstr);//其他字符转宽字符static LPWSTR OtherToWPtr(UINT CodePage, LPCSTR lpInStr);static BOOL OtherToWBuf(UINT CodePage, LPCSTR lpInStr, LPWSTR lpOutStr, int cchOut);static std::wstring OtherStrToWStr(UINT CodePage, const std::string&);
};

CStrUtils.cpp

#include "CStrUtils.h"
#include <stringapiset.h>
#include <strsafe.h>//中立字符串转换
_tstring CStrUtils::WStrToTStr(const std::wstring& str)
{
#ifdef _UNICODEreturn str;
#elsereturn WStrToAStr(str);
#endif
}_tstring CStrUtils::AStrToTStr(const std::string& str)
{
#ifdef _UNICODEreturn AStrToWStr(str);
#elsereturn str;
#endif
}_tstring CStrUtils::U8StrToTStr(const std::string& str)
{
#ifdef _UNICODEreturn U8StrToWStr(str);
#elsereturn U8StrToAStr(str);
#endif
}std::wstring CStrUtils::TStrToWStr(const _tstring& tstr)
{
#ifdef _UNICODEreturn tstr;
#elsereturn AStrToWStr(tstr);
#endif
}std::string CStrUtils::TStrToAStr(const _tstring& tstr)
{
#ifdef _UNICODEreturn WStrToAStr(tstr);
#elsereturn tstr;
#endif
}std::string CStrUtils::TStrToU8Str(const _tstring& tstr)
{
#ifdef _UNICODEreturn WStrToU8Str(tstr);
#elsereturn AStrToU8Str(tstr);
#endif
}//Unicode
LPSTR CStrUtils::WToAPtr(LPCWSTR lpInStr)
{return WToOtherPtr(CP_ACP, lpInStr);
}BOOL CStrUtils::WToABuf(LPCWSTR lpInStr, LPSTR lpOutStr, int cchOut)
{return WToOtherBuf(CP_ACP, lpInStr, lpOutStr, cchOut);
}LPSTR CStrUtils::WToU8Ptr(LPCWSTR lpInStr)
{return WToOtherPtr(CP_UTF8, lpInStr);
}BOOL CStrUtils::WToUtf8Buf(LPCWSTR lpInStr, LPSTR lpOutStr, int cchOut)
{return WToOtherBuf(CP_UTF8, lpInStr, lpOutStr, cchOut);
}BOOL CStrUtils::WToTBuf(LPCWSTR lpInStr, LPTSTR lpOutStr, int cchOut)
{
#ifdef _UNICODEreturn S_OK == StringCchCopy(lpOutStr, cchOut, lpInStr);
#elsereturn WToABuf(lpInStr, lpOutStr, cchOut);
#endif
}std::string CStrUtils::WStrToAStr(const std::wstring& wstr)
{return WStrToOtherStr(CP_ACP, wstr);
}
std::string CStrUtils::WStrToU8Str(const std::wstring& wstr)
{return WStrToOtherStr(CP_UTF8, wstr);
}LPWSTR CStrUtils::AToWPtr(LPCSTR lpInStr)
{return OtherToWPtr(CP_ACP, lpInStr);
}BOOL CStrUtils::AToWBuf(LPCSTR lpInStr, LPWSTR lpOutStr, int cchOut)
{return OtherToWBuf(CP_ACP, lpInStr, lpOutStr, cchOut);
}LPSTR CStrUtils::AToU8Ptr(LPCSTR lpInStr)
{LPWSTR lpWStr = NULL;LPSTR lpMultiStr = NULL;lpWStr = AToWPtr(lpInStr);if (NULL == lpWStr){return NULL;}lpMultiStr = WToU8Ptr(lpWStr);(void)FreePtr(lpWStr);return lpMultiStr;
}BOOL CStrUtils::AToUtf8Buf(LPCSTR lpInStr, LPSTR lpOutStr, int cchOut)
{LPWSTR lpWStr = NULL;BOOL isSuccess = FALSE;lpWStr = AToWPtr(lpInStr);if (NULL == lpWStr){return FALSE;}isSuccess = WToUtf8Buf(lpWStr, lpOutStr, cchOut);(void)FreePtr(lpWStr);return isSuccess;
}BOOL CStrUtils::AToTbuf(LPCSTR lpInStr, LPTSTR lpOutStr, int cchOut)
{
#ifdef _UNICODEreturn AToWBuf(lpInStr, lpOutStr, cchOut);
#elsereturn S_OK == StringCchCopy(lpOutStr, cchOut, lpInStr);
#endif
}std::wstring CStrUtils::AStrToWStr(const std::string& str)
{return OtherStrToWStr(CP_ACP, str);
}std::string CStrUtils::AStrToU8Str(const std::string& str)
{return WStrToOtherStr(CP_UTF8, AStrToWStr(str));
}LPWSTR CStrUtils::U8ToWPtr(LPCSTR lpInStr)
{return OtherToWPtr(CP_UTF8, lpInStr);
}BOOL CStrUtils::U8ToWBuf(LPCSTR lpInStr, LPWSTR lpOutStr, int cchOut)
{return OtherToWBuf(CP_UTF8, lpInStr, lpOutStr, cchOut);
}LPSTR CStrUtils::U8ToAPtr(LPCSTR lpInStr)
{LPWSTR lpWStr = NULL;LPSTR lpMultiStr = NULL;lpWStr = U8ToWPtr(lpInStr);if (NULL == lpWStr){return NULL;}lpMultiStr = WToAPtr(lpWStr);(void)FreePtr(lpWStr);return lpMultiStr;
}BOOL CStrUtils::U8ToABuf(LPCSTR lpInStr, LPSTR lpOutStr, int cchOut)
{LPWSTR lpWStr = NULL;BOOL isSuccess = FALSE;lpWStr = U8ToWPtr(lpInStr);if (NULL == lpWStr){return FALSE;}isSuccess = WToABuf(lpWStr, lpOutStr, cchOut);(void)FreePtr(lpWStr);return isSuccess;
}BOOL CStrUtils::U8ToTbuf(LPCSTR lpInStr, LPTSTR lpOutStr, int cchOut)
{
#ifdef _UNICODEreturn U8ToWBuf(lpInStr, lpOutStr, cchOut);
#elsereturn U8ToABuf(lpInStr, lpOutStr, cchOut);
#endif
}std::wstring CStrUtils::U8StrToWStr(const std::string& str)
{return OtherStrToWStr(CP_UTF8, str);
}std::string CStrUtils::U8StrToAStr(const std::string& str)
{return WStrToAStr(OtherStrToWStr(CP_UTF8, str));
}LPSTR CStrUtils::WToOtherPtr(UINT CodePage, LPCWSTR lpInStr)
{LPSTR lpMultiByteStr = NULL;int nConverted = 0;//计算缓冲区所需的字节大小nConverted = ::WideCharToMultiByte(CodePage, 0, lpInStr, -1, NULL, 0, NULL, NULL);if (0 == nConverted){return NULL;}//分配内存lpMultiByteStr = (LPSTR)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, nConverted);if (NULL == lpMultiByteStr){return NULL;}//转换nConverted = ::WideCharToMultiByte(CodePage, 0, lpInStr, -1, lpMultiByteStr, nConverted, NULL, NULL);if (0 == nConverted){return NULL;}return lpMultiByteStr;
}BOOL CStrUtils::WToOtherBuf(UINT CodePage, LPCWSTR lpInStr, LPSTR lpOutStr, int cchOut)
{int nConverted = 0;nConverted = ::WideCharToMultiByte(CodePage, 0, lpInStr, -1, lpOutStr, cchOut, NULL, NULL);if (0 == nConverted){return FALSE;}return TRUE;
}std::string CStrUtils::WStrToOtherStr(UINT CodePage, const std::wstring& wstr)
{std::string strRes;LPSTR lpStr = WToOtherPtr(CodePage, wstr.c_str());if (NULL != lpStr){strRes = lpStr;FreePtr(lpStr);}return strRes;
}LPWSTR CStrUtils::OtherToWPtr(UINT CodePage, LPCSTR lpInStr)
{LPWSTR lpWCharStr = NULL;int nConverted = 0;//计算缓冲区所需的字节大小nConverted = ::MultiByteToWideChar(CodePage, 0, lpInStr, -1, NULL, 0);if (0 == nConverted){return NULL;}//分配缓冲内存lpWCharStr = (LPWSTR)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, nConverted * sizeof(WCHAR));if (NULL == lpWCharStr){return NULL;}//转换字符串nConverted = ::MultiByteToWideChar(CodePage, 0, lpInStr, -1, lpWCharStr, nConverted);if (0 == nConverted){return NULL;}return lpWCharStr;
}BOOL CStrUtils::OtherToWBuf(UINT CodePage, LPCSTR lpInStr, LPWSTR lpOutStr, int cchOut)
{int nConverted = 0;nConverted = ::MultiByteToWideChar(CodePage, 0, lpInStr, -1, lpOutStr, cchOut);if (0 == nConverted){return FALSE;}return TRUE;
}std::wstring CStrUtils::OtherStrToWStr(UINT CodePage, const std::string& str)
{std::wstring wstrRes;LPWSTR lpStr = OtherToWPtr(CodePage, str.c_str());if (NULL != lpStr){wstrRes = lpStr;FreePtr(lpStr);}return wstrRes;
}VOID CStrUtils::FreePtr(LPWSTR& lpwStr)
{if (lpwStr){::HeapFree(::GetProcessHeap(), 0, lpwStr);lpwStr = NULL;}
}VOID CStrUtils::FreePtr(LPSTR& lpStr)
{if (lpStr){::HeapFree(::GetProcessHeap(), 0, lpStr);lpStr = NULL;}
}

Test.cpp

#include "CStrUtils.h"int main()
{static std::string strAnsi;static std::string strUtf8;static std::wstring wstrUnicode;LPCWSTR lpUnicodeInput = L"宽字符测试";LPCSTR lpAnsiInput = "ANSI字符测试";LPCSTR lpUtf8Input = u8"UTF-8字符测试";strAnsi = CStrUtils::WStrToAStr(lpUnicodeInput);strUtf8 = CStrUtils::WStrToU8Str(lpUnicodeInput);wstrUnicode = CStrUtils::AStrToWStr(lpAnsiInput);strUtf8 = CStrUtils::AStrToU8Str(lpAnsiInput);wstrUnicode = CStrUtils::U8StrToWStr(lpUtf8Input);strAnsi = CStrUtils::U8StrToAStr(lpUtf8Input);return 0;
}

Win32 常用字符串编码转换相关推荐

  1. 站长在线Python精讲:Python中字符串编码转换encode编码和decode解码详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<Python中字符串编码转换:encode编码和decode解码详解>.本知识点主要内容有:常用编码简介.使用encode( ...

  2. chrome字符串编码转换

    chrome字符串编码转换 字符串编码转换涉及宽字节表示法与UTF-8表示法之间的转换.宽字节表示法与UTF-16表示法之间的转换.UTF-8表示法与UTF-16表示法之间的转换.UTF-16表示法于 ...

  3. 分享万能java字符串编码转换工具类

    代码下载地址:http://www.zuidaima.com/share/1795356301560832.htm 原文:分享万能java字符串编码转换工具类 package com.zuidaima ...

  4. java万能编码转换_分享万能java字符串编码转换工具类

    package com.zuidaima.util; import java.io.UnsupportedEncodingException; /** * 转换字符串的编码 */ public cla ...

  5. 【QT小记】QT中QString与常用字符编码转换

    前言 记录在使用QString的过程中与常用字符编码的转换方法以及乱码的可能原因和解决方法 例子 字符串 编码方式 十六进制 林 Unicode 0x6797 GBK 0xC1D6 UTF8 0xE6 ...

  6. 字符串 编码转换 ATL

    相关链接: http://www.vckbase.com/index.php/wv/1206 不同的编码的存储方式不同,经常需要进行编码的转换 重点关注:ATL的内存占用问题,可能导致的栈溢出: 使用 ...

  7. python中字符串编码转换

    字符串编码转换程序员最苦逼的地方,什么乱码之类的几乎都是由汉字引起的. 其实编码问题很好搞定,只要记住一点: 任何平台的任何编码,都能和Unicode互相转换. UTF-8与GBK互相转换,那就先把U ...

  8. unix系统编码 java_Java 正确的做字符串编码转换

    字符串的内部表示? 字符串在java中统一用unicode表示( 即utf-16 LE) , 对于 String s = "你好哦!"; 如果源码文件是GBK编码, 操作系统(wi ...

  9. 关于\x开头的字符串编码转换中文解决方法

    做爬虫可能经常遇到爬取到的数据存在编码问题,简直让人头疼,比如爬取到的是这样的: 例如: \xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c 中文是: 你 ...

最新文章

  1. 某些插件 的一点小特性
  2. Android IOS WebRTC 音视频开发总结(二三)-- hurtc使用说明
  3. Docker命令基础 简洁版本
  4. volatile的作用(转自于http://www.csdn.net/)——今天差点忘记了!
  5. Linux 中的零拷贝技术,第 2 部分
  6. Modelsim se仿真Xilinx IPcore
  7. Apache Cassandra 1.1.0 稳定版发布
  8. Android Frame动画概述及示例
  9. Python GUI设计 PythonWx
  10. LeetCode:Permutations, Permutations II(求全排列)
  11. Medieval Rampage
  12. Python-Matplotlib可视化(10)——一文详解3D统计图的绘制
  13. open in browser
  14. 策略模式探究(二)多个门禁对接使用策略模式
  15. 视频画面大小剪裁操作教程
  16. 三栏式布局详解(代码+图解)
  17. 基于Pandas的股票数据分析
  18. 大话数据结构——烂笔头
  19. android中app分享小程序卡片及跳转回app
  20. 计算机毕设之电影购票系统

热门文章

  1. ORACLE ora-00954:缺失identified关键字
  2. SpringBoot 项目中 YML 配置文件的使用
  3. Dreamweaver安装jQuery插件jQuery_API.mxp
  4. Revit如何将明细表导出为DWG格式【批量导出图纸】
  5. 原创的模拟人生2(the sims2)全11个资料片的免安装恢复注册表~!
  6. DP4361国产六通道立体声D/A音频转换器芯片替代CS4361
  7. VirtualBox 安装Mac OS 10.13 及安装增强功能
  8. VirtualBox虚拟机安装Mac OS 10.12过程记录
  9. DaVinci:色彩匹配
  10. C++ OpenCV生成九宫格图像