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字符转码的更多相关文章

  1. native2ascii.exe 字符转码与反转码

    本人最近在做OAF的二次开发,在看别人写的代码时,发现总有类似这样的语句:”\u65e0\u6548\u7684GP\u9879\u76ee\u7f16\u53f7“,这些语句其实是用Java_hom ...

  2. C#编程总结(十)字符转码

    C#编程总结(十)字符转码 为了适应某种特殊需要,字符需要根据规则进行转码,便于传输.展现以及其他操作等. 看看下面的转码,就知道他的用处了. 1.字符串转码 根据原编码格式与目标编码格式,完成转换. ...

  3. 【jquery】字符ascii码转换函数

    js 字符ascii码转换函数 字符转ascii码:用charCodeAt();ascii码砖字符:用fromCharCode(); 看一个小例子 <script> str="A ...

  4. 关于htmlspecialchars实体字符转码的问题

    php对post过来的数据进行实体字符转码,我的页面编码是gb2312,刚开始是这样: $post = htmlspecialchars ( $post); 取到的$post值为空,但是有时候是好的( ...

  5. python:字符串转换成字节的三种方式及字符转码问题

    str='zifuchuang' 第一种 b'zifuchuang'第二种bytes('zifuchuang',encoding='utf-8')第三种('zifuchuang').encode('u ...

  6. Go url编码和字符转码

    类似php中的urlencode 和htmlspecialchars: package main import ( "fmt" "html" "net ...

  7. String中文字符转码

    如何使用String构造方法和String.getBytes()做好中文字符转码 @Test public void test() { String testStr = "中"; ...

  8. C#编程总结 字符转码

    为了适应某种特殊需要,字符需要根据规则进行转码,便于传输.展现以及其他操作等. 看看下面的转码,就知道他的用处了. 1.字符串转码 根据原编码格式与目标编码格式,完成转换.不过可能出现乱码哦.上一章已 ...

  9. MFC基础类源码CPP实现文件

    WinMain.CPP---->AfxWinMain()  //近似可认为是WinMain()函数的入口 VIEWCORE.CPP---->CView DOCCORE.CPP----> ...

随机推荐

  1. Mysql高手系列 - 第10篇:常用的几十个函数详解,收藏慢慢看

    这是Mysql系列第10篇. 环境:mysql5.7.25,cmd命令中进行演示. MySQL 数值型函数 函数名称 作 用 abs 求绝对值 sqrt 求二次方根 mod 求余数 ceil 和 ce ...

  2. ansible-playbook流程控制-loops循环使用

    1. ansible-playbook流程控制-loops循环使用    有时你想要多次重复任务.在计算机编程中,这称为循环.common ansible循环包括使用文件模块更改多个文件和/或目录的所 ...

  3. 亮剑.NET学习札记

    学习前提要: 因为书的版本过老,有些章节不学了,要学的包括以下章节 暂定:1,2,4,5,6,7,9,10,11,12,13,14,15,16,17,18,附录A 第一章:主要是介绍.NET,包括面向 ...

  4. 01 (H5*) Vue第一天

    目录 1:什么是Vue.js 2:MVC和MVVM. 3:为什么要学习前段框架 4:框架和库的区别 5:怎么使用Vue. 6:常见的Vue指令 7:  五大事件修饰符 8:在vue中使用class样式 ...

  5. FourAndSix2 靶机渗透

    0x01 简介 FourAndSix2是易受攻击的一个靶机,主要任务是通过入侵进入到目标靶机系统然后提权,并在root目录中并读取flag.tx信息 FourAndSix2.镜像下载地址: https ...

  6. Apache Hadoop集群安装(NameNode HA + YARN HA + SPARK + 机架感知)

    1.主机规划 序号 主机名 IP地址 角色 1 nn-1 192.168.9.21 NameNode.mr-jobhistory.zookeeper.JournalNode 2 nn-2 192.16 ...

  7. [C++] 类的使用(1)

    1.类的基本思想是数据抽象和封装.数据抽象是一种依赖于接口和实现分离的编程(以及设计)技术. 2.常量对象,以及常量对象的引用或指针都只能调用常量成员函数.因为非常量成员函数有可能修改其作用的对象,与 ...

  8. 线上CPU飙升100%问题排查,一篇足矣

    一.引子 对于互联网公司,线上CPU飙升的问题很常见(例如某个活动开始,流量突然飙升时),按照本文的步骤排查,基本1分钟即可搞定!特此整理排查方法一篇,供大家参考讨论提高. 二.问题复现 线上系统突然 ...

  9. Linux系统在开机的时候自动启动SVN

    Linux系统在开机的时候自动启动SVN 1.创建执行脚本svn.sh(/root路径下,随便哪个路径),其内容很简单,如下: #!/bin/bash     svnserve -d --listen ...

  10. 用.NET做动态域名解析

    用.NET做动态域名解析 动态域名解析,或DNSR,通常用于解析IP地址经常变化的域名.电信网络提供了公网IP,给广大程序员远程办公.内容分享等方面带来了极大的便利.但公网IP是动态的,它会经常变化, ...