编码问题(且vs编码高级保存设置UTF-8无用)
问题
建图时,从文件读入的数据是乱码(使用string保存)。
解决办法
vs改了没有用,去修改了数据文件的保存编码,顺应vs改成国标了。(治标不治本?)
新问题
智能问答时,从控制台读入一串汉字,遍历时1个汉字被拆成2个字符遍历,并且控制台输出无法显示,显示为空(因为要和 “的” 这个字进行分割匹配,使用wstring保存控制台的输入内容,使用for (wchar_t c : line)遍历)
- 本应该达成的效果:按一个汉字一个汉字地遍历,且控制台能够正确显示wstring结果。
- 解决方法:在函数开头设置 std::locale::global(std::locale("chs")); 将全局的 C++ 环境的地域(locale)设置为 "chs",以影响程序中的本地化行为,如字符集和数字格式等。
- 效果:成功了。
其他待尝试的方法
- 1.改用正则表达式处理
- 2.安装别的库来处理字符集问题 比如boost库
- 3.配置控制台的输出字符集支持选项并且想明白vs的编码问题
- 4.不使用wstring,使用string,然后2个指针构成一个汉字,从而匹配“的”这个汉字
我的代码:
我的博客自己设置了一些javascript/css格式,所以下面的代码段是没有语法高亮的,最下面有我在vs上面的代码截图。
void smartQuery() {
std::locale::global(std::locale("chs"));
wstring line, start, word;
cout << "\n输入你想查的关系链,例如 荀彧的主公的儿子\n";
wcin >> line;
wchar_t split = L'的';
//我的想法是,"的"字作为分隔符 ,start用来保存路径里找到的当前人名,word用来保存关系
//第一轮start=荀彧 word=主公
//第二轮start=曹操 word=儿子
//第三轮得出start=曹昂 结束查询
for (wchar_t c : line) {
if (c != split) {
word.push_back(c);
}
if (c == split || c == line[line.size() - 1]) {
if (start.empty()) {
start = word;
}
else {
//关系查找函数是之前功能的复用,只接受string参数,所以编写了wstring和string相互转化的2个函数
string strStart = wstringToString(start);
string strWord = wstringToString(word);
strStart = findDirectlyByRelation(strStart, strWord);
if (strStart == "") {
cout << "查无此人!\n";
return;
}
start = stringToWstring(strStart);
}
word.clear();
}
}
wcout << start << endl;
}
标签:me,word,help,locale,老师,wstring,start,line,string
From: https://www.cnblogs.com/lmj00/p/17647049.html