【发布时间】:2017-06-22 22:18:43
【问题描述】:
我有一个程序,旨在读取一个包含单词的文本文件(每个单词位于单独的一行),然后从该文件中打印出一个随机单词。它还使您能够选择非英语语言(例如希腊语或俄语)。由于后一种情况,我使用std::wstring 来捕获文本。代码如下:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstdlib>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/random_device.hpp>
#include <boost/random/uniform_int_distribution.hpp>
int main(int argc, char* argv[]) {
if (argc != 2) {
std::cout << "Usage: word [lang]" << std::endl;
std::cout << "\tlang: Choose from de,en,es,fr,gr,it,la,ru" << std::endl;
return EXIT_FAILURE;
}
std::string file = static_cast<std::string>("C:\\util_bin\\data\\words_") + static_cast<std::string>(argv[1]) + static_cast<std::string>(".txt");
std::wfstream fin(file, std::wifstream::in);
std::vector<std::wstring> data;
std::wstring line;
while (std::getline(fin, line))
data.push_back(line);
int size = data.size();
boost::random::random_device rd;
boost::random::mt19937 mt(rd());
boost::random::uniform_int_distribution<int> dist(0, size - 1);
std::wcout << data[dist(mt)] << std::endl;
}
这段代码编译得很好,但是当我用俄语(例如)运行它时,我只会得到垃圾文本:
C:\util_bin>word ru
������������
C:\util_bin>
我对 C++ 中宽字符的来龙去脉不是很熟悉,所以我无法真正辨别出哪里出了问题。有人有什么想法吗?
【问题讨论】:
-
您确定将 Windows 控制台设置为以
std:wstring使用的编码显示字符吗? -
我确实将命令提示符中的 `chcp' 设置为 65001。仍然给了我字符串。
-
chcp 65001启用(基本)UTF-8 解码。请参阅 Vada Poché 的回答。 -
你看过 Joel Spolsky 的 Unicode 文章