老师 help me T^T

发布时间 2023-08-21 20:41:28作者: lmj625

编码问题(且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个指针构成一个汉字,从而匹配“的”这个汉字

我的代码:

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;
}