mfc字符转码
std::wstring UTF8ToUnicode(const std::string& utf8string)
 {
  int widesize = ::MultiByteToWideChar(CP_UTF8, , utf8string.c_str(), -, NULL, );
  if (widesize == ERROR_NO_UNICODE_TRANSLATION)
  {
   throw std::exception("Invalid UTF-8 sequence.");
  }
  if (widesize == )
  {
   throw std::exception("Error in conversion.");
  }
  std::vector<wchar_t> resultstring(widesize);
  int convresult = ::MultiByteToWideChar(CP_UTF8, , utf8string.c_str(), -, &resultstring[], widesize);
  if (convresult != widesize)
  {
   throw std::exception("La falla!");
  }
  return std::wstring(&resultstring[]);
 }
std::string WideByteToAcsi(std::wstring& wstrcode)
 {
  int asciisize = ::WideCharToMultiByte(CP_OEMCP, , wstrcode.c_str(), -, NULL, , NULL, NULL);
  if (asciisize == ERROR_NO_UNICODE_TRANSLATION)
  {
   throw std::exception("Invalid UTF-8 sequence.");
  }
  if (asciisize == )
  {
   throw std::exception("Error in conversion.");
  }
  std::vector<char> resultstring(asciisize);
  int convresult = ::WideCharToMultiByte(CP_OEMCP, , wstrcode.c_str(), -, &resultstring[], asciisize, NULL, NULL);
  if (convresult != asciisize)
  {
   throw std::exception("La falla!");
  }
  return std::string(&resultstring[]);
 }
std::string UTF8ToASCII(std::string& strUtf8Code)
{
 std::string strRet("");
 //先把 utf8 转为 unicode  
 std::wstring wstr = UTF8ToUnicode(strUtf8Code);
 //最后把 unicode 转为 ascii  
 strRet = WideByteToAcsi(wstr);
 return strRet;
}
std::string ASCIIToUTF8(std::string& strASCIICode)
 {
  std::string strOutUTF8 = "";
  WCHAR * str1;
  int n = MultiByteToWideChar(CP_ACP, , strASCIICode.c_str(), -, NULL, );
  str1 = new WCHAR[n];
  MultiByteToWideChar(CP_ACP, , strASCIICode.c_str(), -, str1, n);
  n = WideCharToMultiByte(CP_UTF8, , str1, -, NULL, , NULL, NULL);
  char * str2 = new char[n];
  WideCharToMultiByte(CP_UTF8, , str1, -, str2, n, NULL, NULL);
  strOutUTF8 = str2;
  delete[]str1;
  str1 = NULL;
  delete[]str2;
  str2 = NULL;
  return strOutUTF8;
 }
//!!为了减少字符串的拷贝,改为使用shared_array,性能升级
#include <boost/shared_array.hpp>
#define CHAR_EMPTY_ARR_PTR boost::shared_array<char>(new char[1]{'\0'})
#define WCHAR_EMPTY_ARR_PTR boost::shared_array<wchar_t>(new wchar_t[1]{L'\0'})
boost::shared_array<char> UTF8ToASCII(std::string& strUtf8Code)
 {
  return std::move(UTF8ToASCII(strUtf8Code.c_str()));
 }
boost::shared_array<char> UTF8ToASCII(const char* ch, int nLen /*= -1*/)
 {
  //先把 utf8 转为 unicode  
  auto wstr = UTF8ToUnicode(ch, nLen);
  //最后把 unicode 转为 ascii  
  return std::move(WideByteToAcsi(wstr.get()));
 }
boost::shared_array<char> ASCIIToUTF8(std::string& strASCIICode)
 {
  return std::move(ASCIIToUTF8(strASCIICode.c_str()));
 }
boost::shared_array<char> ASCIIToUTF8(const char* ch, int nLen/* = -1*/)
 {
  int n = MultiByteToWideChar(CP_ACP, , ch, nLen, NULL, );
  if ( == n)
  {
   return CHAR_EMPTY_ARR_PTR;
  }
  boost::shared_array<wchar_t> ptrWtArr(new wchar_t[n]{ L'\0' });
  if ( == MultiByteToWideChar(CP_ACP, , ch, nLen, ptrWtArr.get(), n))
  {
   return CHAR_EMPTY_ARR_PTR;
  }
  n = WideCharToMultiByte(CP_UTF8, , ptrWtArr.get(), -, NULL, , NULL, NULL);
  if ( == n)
  {
   return CHAR_EMPTY_ARR_PTR;
  }
  boost::shared_array<char> ptrArr(new char[n]{ '\0' });
  if ( == WideCharToMultiByte(CP_UTF8, , ptrWtArr.get(), -, ptrArr.get(), n, NULL, NULL))
  {
   return CHAR_EMPTY_ARR_PTR;
  }
  return std::move(ptrArr);
 }
boost::shared_array<wchar_t> UTF8ToUnicode(const char* ch, int nLen /*= -1*/)
 {
  int widesize = ::MultiByteToWideChar(CP_UTF8, , ch, nLen, NULL, );
  if ( == widesize)
  {
   return WCHAR_EMPTY_ARR_PTR;
  }
  boost::shared_array<wchar_t> ptrWtArr(new wchar_t[widesize]{ L'\0' });
  int convresult = ::MultiByteToWideChar(CP_UTF8, , ch, nLen, ptrWtArr.get(), widesize);
  if ( == convresult)
  {
   return WCHAR_EMPTY_ARR_PTR;
  }
  return std::move(ptrWtArr);
 }
 boost::shared_array<char> DPC::WideByteToAcsi(std::wstring& wstrcode)
 {
  return std::move(WideByteToAcsi(wstrcode.c_str()));
 }
boost::shared_array<char> WideByteToAcsi(const wchar_t* wch, int nLen /*= -1*/)
 {
  int asciisize = ::WideCharToMultiByte(CP_OEMCP, , wch, nLen, NULL, , NULL, NULL);
  if ( == asciisize)
  {
   return CHAR_EMPTY_ARR_PTR;
  }
  boost::shared_array<char> ptrArr(new char[asciisize + ]{'\0'});
  int convresult = ::WideCharToMultiByte(CP_OEMCP, , wch, nLen, ptrArr.get(), asciisize, NULL, NULL);
  if ( == convresult)
  {
   return CHAR_EMPTY_ARR_PTR;
  }
  return std::move(ptrArr);
 }
mfc字符转码的更多相关文章
- native2ascii.exe 字符转码与反转码
		本人最近在做OAF的二次开发,在看别人写的代码时,发现总有类似这样的语句:”\u65e0\u6548\u7684GP\u9879\u76ee\u7f16\u53f7“,这些语句其实是用Java_hom ... 
- C#编程总结(十)字符转码
		C#编程总结(十)字符转码 为了适应某种特殊需要,字符需要根据规则进行转码,便于传输.展现以及其他操作等. 看看下面的转码,就知道他的用处了. 1.字符串转码 根据原编码格式与目标编码格式,完成转换. ... 
- 【jquery】字符ascii码转换函数
		js 字符ascii码转换函数 字符转ascii码:用charCodeAt();ascii码砖字符:用fromCharCode(); 看一个小例子 <script> str="A ... 
- 关于htmlspecialchars实体字符转码的问题
		php对post过来的数据进行实体字符转码,我的页面编码是gb2312,刚开始是这样: $post = htmlspecialchars ( $post); 取到的$post值为空,但是有时候是好的( ... 
- python:字符串转换成字节的三种方式及字符转码问题
		str='zifuchuang' 第一种 b'zifuchuang'第二种bytes('zifuchuang',encoding='utf-8')第三种('zifuchuang').encode('u ... 
- Go url编码和字符转码
		类似php中的urlencode 和htmlspecialchars: package main import ( "fmt" "html" "net ... 
- String中文字符转码
		如何使用String构造方法和String.getBytes()做好中文字符转码 @Test public void test() { String testStr = "中"; ... 
- C#编程总结  字符转码
		为了适应某种特殊需要,字符需要根据规则进行转码,便于传输.展现以及其他操作等. 看看下面的转码,就知道他的用处了. 1.字符串转码 根据原编码格式与目标编码格式,完成转换.不过可能出现乱码哦.上一章已 ... 
- MFC基础类源码CPP实现文件
		WinMain.CPP---->AfxWinMain() //近似可认为是WinMain()函数的入口 VIEWCORE.CPP---->CView DOCCORE.CPP----> ... 
随机推荐
- django学之路01--环境安装和pycharm运行django项目
			1. 环境安装 1).virtualenv安装 C:\Users\Administrator>pip install virtualenv Collecting virtualenv Using ... 
- python实现经典算法
			1,快速排序 题目形式:手写一下快速排序算法. 题目难度:中等. 出现概率:约50%.手写快排绝对是手撕代码面试题中的百兽之王,掌握了它就是送分题,没有掌握它就是送命题. 参考代码: def quic ... 
- TestNG(五)  5-7 套件测试
			<?xml version="1.0" encoding="utf-8" ?> <suite name="test"> ... 
- 【linux】【jenkins】自动化部署一  安装jenkins及Jenkins工作目录迁移
			系统环境:Centos7 https://jenkins.io/zh/download/ 下载对应系统的jenkins 一.安装jdk8.0 jenkins安装需要jdk8or11,根据jenkins ... 
- 小程序开发初体验,从静态demo到接入Bmob数据库完全实现
			之前我胖汾公司年会.问我能不能帮忙搞个小程序方便他们进行游戏后的惩罚/抽奖使用.出了个简单的设计图.大概三天左右做了个简单的小程序.目前提交审核了.对于写过一小段时间vue来说小程序很容易上手.写法和 ... 
- C# 事件 Event
			一.事件是什么 微软的定义:和委托类似,事件是后期绑定机制. 实际上,事件是建立在对委托的语言支持之上的.事件是对象用于(向系统中的所有相关组件)广播已发生事情的一种方式. 任何其他组件都可以订阅事件 ... 
- Python基础(十四)
			今日主要内容 装饰器扩展 有参装饰器 多个装饰器装饰一个函数 递归 一.装饰器扩展 (一)含有参数的装饰器 先来回顾一下装饰器的标准模式 def wrapper(fn): def inner(*arg ... 
- thymeleaf 将后端绑定数据直接传递js变量
			根据自我需求,thymeleaf可以直接将后端数据传递给js中进行使用,例如: 1.后端接口数据: @Controllerpublic class TestController { @RequestM ... 
- Java诊断利器Arthas
			1 简介 Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 ... 
- Kafka 学习笔记之 Producer/Consumer (Scala)
			既然Kafka使用Scala写的,最近也在慢慢学习Scala的语法,虽然还比较生疏,但是还是想尝试下用Scala实现Producer和Consumer,并且用HashPartitioner实现消息根据 ... 
