老师 help me T^T
编码问题(且vs编码高级保存设置UTF-8无用)
问题1.0
建图时,从文件读入的数据是乱码(使用string保存)。
解决办法
vs改了没有用,去修改了数据文件的保存编码,顺应vs改成国标了。(治标不治本?)
问题2.0
智能问答时,从控制台读入一串汉字,遍历时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;
}
