C++ 如果char*必须包含西里尔字符,如何将其转换为std::string?

C++ 如果char*必须包含西里尔字符,如何将其转换为std::string?,c++,encoding,C++,Encoding,我正在使用C库分析MS Excel文件。reading函数返回char*string,我必须将其转换为std::string。问题是我的文件包含西里尔字母符号,所以我得到的字符串是“ПЎПґПааа”而不是“Саааа”) 我尝试过使用std::wstring,但这最终会对字符造成更大的破坏。我还尝试使用记事本++来恢复字符,效果很好:将输出字符串粘贴到新文档中,然后按“在UTF8中编码”可以显示正确的单词,但我在代码中尝试这样做都没有成功。所以chsr*字符串似乎是ANSI字符串,我想要的st

我正在使用C库分析MS Excel文件。reading函数返回char*string,我必须将其转换为std::string。问题是我的文件包含西里尔字母符号,所以我得到的字符串是“ПЎПґПааа”而不是“Саааа”)

我尝试过使用std::wstring,但这最终会对字符造成更大的破坏。我还尝试使用记事本++来恢复字符,效果很好:将输出字符串粘贴到新文档中,然后按“在UTF8中编码”可以显示正确的单词,但我在代码中尝试这样做都没有成功。所以chsr*字符串似乎是ANSI字符串,我想要的std::字符串是UTF8字符串,但我发现的算法都不起作用

我的代码片段

char*值;
while((value=xlsxiooread\u sheet\u next\u cell(sheet))!=NULL)
{
std::字符串str(值);

std::cout如果字符串为utf8,则需要将locale设置为utf8:

std::setlocale(LC_ALL, "en_US.utf8");
std::cout << "Test: " << utf8str << std::endl;
std::setlocale(LC_ALL,“en_US.utf8”);

std::cout刚刚发现我必须将UTF8字符串转换为ANSI字符串,并使用正确的代码页(在这种情况下为Windows1251)来实现这一目标

字符串UTF8ToANSI(字符串s)
{
BSTR-bstrWide;
char*pszAnsi;
国际长度;
const char*pszCode=s.c_str();
nLength=MultiByteToWideChar(CP_UTF8,0,pszCode,strlen(pszCode)+1,NULL,NULL);
bstrWide=SysAllocStringLen(NULL,nLength);
MultiByteToWideChar(CP_UTF8,0,pszCode,strlen(pszCode)+1,bstrWide,nLength);
nLength=WideCharToMultiByte(CP_ACP,0,bstrWide,-1,NULL,0,NULL,NULL);
pszAnsi=新字符[nLength];
宽图表多字节(CP_ACP,0,bstrWide,-1,pszAnsi,nLength,NULL,NULL);
SysFreeString(bstrWide);
字符串r(pszAnsi);
删除[]pszAnsi;
返回r;
}
这个问题有点愚蠢,但我认为它可能对某些人有用。还要感谢@Ville Valtteri的帮助

编辑: 您可能需要将ANSI Win1251字符串转换回UTF8字符串。这可以通过我在internet上找到的以下代码来完成:

std::string ANSIToUTF8(std::string str)
{
std::string res;
int result_,result_c;
结果_=MultiByteToWideChar(1251,0,str.c_str(),-1,0,0);
如果(!result_){返回0;}
wchar_t*ures=新的wchar_t[结果];
if(!MultiByteToWideChar(1251,0,str.c_str(),-1,ures,result_)){
删除[]条;
返回0;
}
结果_c=宽图表多字节(65001,0,ures,-1,0,0,0,0);
如果(!结果_c){
删除[]条;
返回0;
}
char*cres=新字符[result_c];
如果(!WideChartMultiByte(65001,0,ures,-1,cres,结果c,0,0)){
删除[]个CRS;
返回0;
}
删除[]条;
res.append(cres);
删除[]个CRS;
返回res;
}

看起来您已经正确地将字符串读取为UTF-8。您的问题是如何使字符在控制台中正确显示?如果是,您的问题是要澄清问题。std::string是否冗余?如果您仅在循环中使用它,您只需cout@Ville Valtteri我必须进一步使用它,因此我需要一个std::string with里面是西里尔字符。我需要一种方法,用包含“ПЎⶳⶳⶳⶳєа”的字符*生成包含“Сааа”的std::string@Ville Valtteri我只需要包含“Сааааааа”的std::string,而不是“Паааааааа而不是“ђђђццццццц”祝您在Windows上工作顺利。