不管什么项目,或多或少都会遇到那么一点点转码的问题,
本片就提供两个实现Unicode和ASCII互转的函数。
环境为WINDOW 10, VS2010
(该函数在Windows下,也使用了windows的函数,如果使用通用的函数那么请使用C的库“mbstowcs()/wcstombs()”我还是觉得直接用系统的比较方便)
1.UNICODE码转ASCII编码
#include <iostream>
#include <windows.h>
#include <wchar.h>
/*
* 从宽字符串转为ansi字符串
* @param [in] in_str 为输入的源ansi字符
* @return 返回值为ansi字符串
*/
std::string UnicodeToAscii(const std::wstring& in_str)
{
int nNeedChars = WideCharToMultiByte( CP_ACP, 0, in_str.c_str(), -1, 0, 0, 0, 0 );
if (nNeedChars > 0)//再次判断一下
{
std::vector<char> temp(nNeedChars);
::WideCharToMultiByte( CP_ACP, 0, in_str.c_str(), -1, &temp[0], nNeedChars, 0, 0 );
return std::string(&temp[0]);
}
return std::string();
}
2.ASCII转UNICODE编码
#include <iostream>
#include <windows.h>
#include <wchar.h>
/*
* 从ansi字符串转为宽字符串
* @param [in] in_str 为输入的源ansi字符
* @return 返回值为宽字字符串
*/
std::wstring AsciiToUnicode(const std::string& in_str)
{
int nNeedWchars = MultiByteToWideChar( CP_ACP, 0, in_str.c_str(), -1, NULL, 0 );
if (nNeedWchars > 0)
{
std::vector<wchar_t> temp(nNeedWchars);
::MultiByteToWideChar( CP_ACP, 0, in_str.c_str(), -1, &temp[0], nNeedWchars );
return std::wstring(&temp[0]);
}
return std::wstring();
}
使用方式 :
int main(int argc, char *argv[])
{
std::wstring chName = L"我是谁";
std::string name_1;
std::wstring name_2;
std::string name_3;
name_1 = UnicodeToAscii(chName);
std::cout << "name_1:(UnicodeToAscii) " << name_1 << std::endl;
name_2 = AsciiToUnicode(name_1);
std::wcout << L"name_2:(AsciiToUnicode) " << name_2 << std::endl;
name_3 = UnicodeToAscii(name_2);
std::cout << "name_1:(UnicodeToAscii) " << name_3 << std::endl;
return 0;
}
结果: