64,654
社区成员
发帖
与我相关
我的任务
分享
#include <errno.h>
#include <clocale>
#include <string>
#include <iostream>
static void locale_init()
{
static bool initialized = false;
if (!initialized)
{
std::setlocale(LC_CTYPE, "");
initialized = true;
}
}
static bool unicode_to_ansi(const wchar_t * unicode_str, std::string & ansi_str)
{
ansi_str.clear();
if (nullptr == unicode_str || L'\0' == unicode_str[0])
{
return(true);
}
locale_init();
std::mbstate_t mbstate = std::mbstate_t();
std::size_t bytes_count = std::wcsrtombs(nullptr, &unicode_str, 0, &mbstate);
if (static_cast<std::size_t>(-1) == bytes_count)
{
return(false);
}
else if (0 != bytes_count)
{
ansi_str.resize(bytes_count);
std::wcsrtombs(&ansi_str[0], &unicode_str, bytes_count, &mbstate);
}
return(true);
}
static void test()
{
std::wstring unicode_test = L"中文";
std::string ansi_test;
errno = 0;
if (unicode_to_ansi(unicode_test.c_str(), ansi_test))
{
std::cout << "ok" << std::endl;
std::cout << "ansi: " << ansi_test << std::endl;
}
else
{
std::cout << "errno:" << errno << std::endl;
perror("");
}
}