C++:比较字符串或包含特殊字符(á、é、ő 等)的字符串或 wstring )

C++: Comparing strings or wstrings with special characters in them (á, é, ő, etc.)

本文关键字:字符串 wstring 比较 包含 特殊字符 C++      更新时间:2023-10-16

我最近接到一个作业,要求我比较单词。我不想完整地描述它,但我必须逐个比较这两个词,看看这两个词有多相似。

现在的问题是我必须使用的输入文本包含很多非标准字符,如 á、é、ő 等。我尝试使用字符串、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];

这将输出"ď »"。我猜问题是他们使用多个字节来存储字符?我只是在这里疯狂猜测,但这将解释为什么

wcslen(wc);

返回 7。

我尝试将 substr 函数与字符串和 wstring 一起使用,但通常似乎不起作用。有人知道如何解决这个问题吗?我在这里错过了一些明显的东西吗?

另外,我正在将代码块与 gcc 编译器一起使用,我在某处读过它不能很好地处理 wchar 和 wstring,这可能是问题所在吗?请记住,我已经用字符串而不是 wstring 尝试了上面的所有内容,结果是一样的。

非常感谢大家的帮助,将不胜感激!

这些字符并不罕见。它们绝对是标准的 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 的可能性几乎为零。