当前位置: 首页 > 知识库问答 >
问题:

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

魏宏邈
2023-03-14

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

现在的问题是我必须使用的输入文本包含许多非标准字符,如 á, é, ő, 等。我尝试使用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”。输出正确。作为记录,如果我使用string而不是wstring,那么一切都是一样的。以下也适用:

const wchar_t* wc = s.c_str();
fileWrite << wc;

但是一旦我尝试引用一个字符,它就会给我胡言乱语。例子:

fileWrite << wc[0] << " " << wc[1];

输出“ď”。我猜问题是他们使用多个字节来存储字符?我只是胡乱猜测,但这可以解释为什么

wcslen(wc);

返回7。

我尝试在string和wstring中使用substr函数,但通常似乎不起作用。有人知道如何解决这个问题吗?我是否遗漏了一些明显的东西?

另外,我在gcc编译器中使用代码块,我在某个地方读到它不能很好地处理wchar和wstring,这可能是问题吗?记住,我已经用string而不是wstring尝试了上面的所有内容,结果是一样的。

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

共有1个答案

雷国兴
2023-03-14

这些字符并不罕见。它们绝对是标准的Unicode字符。不幸的是,普通标准C不支持Unicode的任何细节。你的选择是要么找到一个支持它的好库(例如在MacOS X上运行的代码,或者iOS你只使用操作系统内置的东西,其他操作系统可能也有类似的支持),要么去www.unicode.org下载他们的代码表。阅读你能找到的关于它的一切。

wchar和wstring本质上是不可移植的。你最好的选择是使用UTF-8编码和标准std::字符串。理解UTF-8对于现在的任何程序员来说都是绝对必要的。

这里有一些关于记事本的讨论。许多软件编写的UTF-8前面有一个字节顺序标记(BOM),许多软件使用它来识别UTF-8。如果该字节顺序标记不存在,它们将查看单个字节。文件可能仅由ASCII字符组成,在这种情况下,它的编码方式无关紧要。如果不仅仅是ASCII,例如,包含非ASCII字符的Windows-1252编码文件合法UTF-8的可能性实际上为零。

 类似资料:
  • 问题内容: 我正在开发一个使用jQuery,PHP和JSON作为响应的依赖选择脚本。 除了使用特殊字符(如法语(é,è,à…))外,其他所有内容都运行良好 如果我像(&eacute;,&egrave;和&agrave;)那样对它们进行预编码(这里我在&符和单词的其余部分之间使用空格以防止在我的问题中进行自动编码)它可以工作,但是当使用jquery渲染字符时不会转换为应具有的外观(é…),而是按原样

  • 我想检查一个字符串是否包含特殊字符,比如!@#$%^&*.,<>/\'“;:?如果字符串至少包含其中一个字符,则返回true。 我尝试使用以下regex脚本:

  • 我有一个从xml文档中读取数据的程序。在这个xml文档中,一些属性包含特殊字符,如“\n”、“t”等。 有没有一种简单的方法可以将所有这些字符串替换为实际的字符,或者我必须像下面的例子一样为每个字符手动替换? 手动示例: 编辑: 我正在寻找某种方法来处理字符串,就像这样的转义字符串(尽管我知道这是行不通的)

  • 我有问题。我做了这个练习,但是我不知道如何在我的代码中解决最后三个问题。我需要打印失败,但我不能得到,因为我只得到OK OK,如果这就是全部。 有什么建议吗??

  • 问题内容: 我正在使用urllib从网站获取html字符串,并且需要将html文档中的每个单词放入列表中。 这是我到目前为止的代码。我不断收到错误消息。我还复制了以下错误。 这是错误。 问题答案: str.replace是您要执行的操作错误的函数(除了使用不正确之外)。您想用空格代替集合的任何字符,而不是用单个空格代替整个集合(后者是replace的作用)。您可以使用以下翻译: 这将创建一个映射,

  • 问题内容: 给我输出: 我不太了解第一行,为什么它会给我带来错误? 如果我在字符串2上添加空格,则此行为false,但如果不添加空格,则为true: 为什么第1行给我假,但第6行为真,但是如果我在string2上添加空格则为假。 谢谢=) 问题答案: 那里发生了几件事。 当您将两个字符串声明为相等的“ Hi”时,java将对其进行优化以引用相同的字符串对象(因此不必将相同的字符串存储两次)。 “