C ++:比较字符串或带有特殊字符的字符串(á,é,ő等)

时间:2015-03-14 12:19:43

标签: c++ string char wchar-t wstring

我最近得到了一项要求我比较单词的作业。我不想完整地描述它,但我必须逐字逐句地比较两个单词是多么相似。

现在问题是我必须使用的输入文本包含很多非标准字符,如á,é,ő等。我尝试使用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尝试了上面的所有内容,而且它是一样的。

非常感谢大家的帮助,非常感谢!

1 个答案:

答案 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的可能性几乎为零。