我最近得到了一项要求我比较单词的作业。我不想完整地描述它,但我必须逐字逐句地比较两个单词是多么相似。
现在问题是我必须使用的输入文本包含很多非标准字符,如á,é,ő等。我尝试使用string,wstring,char和wchar_t来表示我的单词,但似乎没有工作正常。一个例子:
setlocale(LC_ALL, "");
std::vector <Word::Word> words;
std::wfstream fileWrite("testout.txt");
std::wstring s = words[0].getString();
fileWrite << s;
我们的字符串在这里包含“Még”字样。它输出正确。对于记录,如果我使用字符串而不是wstring,一切都是一样的。以下也适用:
const wchar_t* wc = s.c_str();
fileWrite << wc;
但是一旦我尝试引用一个字母,就会给我带来胡言乱语。例如:
fileWrite << wc[0] << " " << wc[1];
输出“ď»”。我猜测问题是他们使用多个字节来存储char?我只是疯狂猜测,但这可以解释为什么
wcslen(wc);
返回7.
我尝试将substr函数与string和wstring一起使用,但通常似乎不起作用。任何人都知道如何解决这个问题?我错过了一些明显的东西吗?
另外,我正在使用带有gcc编译器的代码块,我已经在某处看到它不能很好地处理wchar和wstring,这可能是问题吗?记住,我已经用字符串而不是wstring尝试了上面的所有内容,而且它是一样的。
非常感谢大家的帮助,非常感谢!
答案 0 :(得分:1)
这些字符并不罕见。它们绝对是标准的Unicode字符。不幸的是,普通的标准C ++对Unicode的更精细细节没有任何支持。您可以选择找到一个支持它的好库(例如,在MacOS X或iOS上运行的代码,您只需使用操作系统内置的代码,其他操作系统可能有类似支持),或访问www.unicode.org并下载他们的代码表。并阅读有关它的所有信息。
wchar和wstring本质上是不可移植的。最好的办法是使用UTF-8编码和标准的std :: string。对于任何程序员来说,理解UTF-8绝对必不可少。
这里有一些关于记事本的讨论。许多软件写入UTF-8,前面是字节顺序标记(BOM),许多软件使用它来识别UTF-8。如果不存在该字节顺序标记,则它们会查看单个字节。文件有可能只包含ASCII字符,在这种情况下,编码是什么并不重要。如果它不仅仅是ASCII,那么例如包含非ASCII字符的Windows-1252编码文件是合法的UTF-8的可能性几乎为零。