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----> ...
随机推荐
- JS权威指南需要注意的知识点(1-6章)
客官快来看一看了,都给你浓缩好了,确定不进来搂一眼嘛,走过路过不要错过哟 in运算符 in运算符希望它的左操作数是一个字符串或可以转化为字符串,希望它的右操作数是一个对象,如果右侧的对象拥有一个名为左 ...
- go语言新建多维map集合
1:map中加map var map1 map[string]map[string]string //声明变量 map1 = make(map[string]map[s ...
- IntelliJ IDEA 安装,配置,汉化
压缩包:加QQ:1594216971 一.先进行安装包下载安装(五步) 1.运行”IntelliJ IDEA 2018.1.exe“ 开始安装,点击next 2.选择idea安装目录(不建议安装在c盘 ...
- 在.NET Core中使用DispatchProxy“实现”非公开的接口
原文地址:"Implementing" a non-public interface in .NET Core with DispatchProxy 原文作者:Filip W. 译 ...
- [STL] Implement "map", "set"
练习热身 Ref: STL中map的数据结构 C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Re ...
- Cocos Creator 中 _worldMatrix 到底是什么(上)
Cocos Creator 中 _worldMatrix 到底是什么(上) 1. (矩阵)Matrix是什么,有什么用 (矩阵)Matrix一个神奇的存在?在开发过程中对里边各项值的含义是不是抓耳挠腮 ...
- 客户端与服务端的事件watcher源码阅读
watcher存在的必要性 举个特容易懂的例子: 假如我的项目是基于dubbo+zookeeper搭建的分布式项目, 我有三个功能相同的服务提供者,用zookeeper当成注册中心,我的三个项目得注册 ...
- mysql uuid使用
java中可以使用UUID类来生成uuid,使用mysql也可以使用UUID函数来获取uuid,如 select UUID(); 也可以对查询的结果做一些处理,比如说将"-"替换成 ...
- MySQL-Access denied for user 'username'@'localhost' (using password: YES) 解决
使用navicat新建MySQL用户保存时提示 Access denied for user 'username'@'localhost' (using password: YES): 解决方法: 请 ...
- 『王霸之路』从0.1到2.0一文看尽TensorFlow奋斗史
0 序篇 2015年11月,Google正式发布了Tensorflow的白皮书并开源TensorFlow 0.1 版本. 2017年02月,Tensorflow正式发布了1.0.0版本,同时也标志 ...