从QString中提取字符并进行比较

Extract character from QString and compare

本文关键字:比较 字符 QString 提取      更新时间:2023-10-16

我试图比较QString中的特定字符,但得到了奇怪的结果:

我的名为strModified的QString包含:"[y]$trainstrip+[height]$trainstrip+8"

我将字符串转换为标准字符串:

    std:string stdstr = strModified.toStdString();

我可以在调试器中看到"stdstr"包含正确的内容,但当我尝试提取字符时:

    char cCheck = stdstr.c_str()[3];

我得到了完全不同的东西,我本以为会看到"英镑",但结果却得到了-62英镑。我意识到"£"在ASCII字符集之外,代码为156。

但它在回归什么呢?

我修改了原始代码以简化,现在:

    const QChar cCheck = strModified.at(intClB + 1);
    if ( cCheck == mccAttrMacroDelimited ) {
       ...
    }

其中mccAttrMacroDelimited定义为:

   const QChar clsXMLnode::mccAttrMacroDelimiter = '£';

在调试器中,当查看应该是相同值的两个定义时,我得到:

   cCheck: -93 '£'
   mccAttrMacroDelimiter:  -93 with what looks like a chinese character

比较失败。。。发生了什么事?

我已经完成了将所有QChar引用更改为无符号字符的代码,现在我得到了一个警告:

    large integer implicitly truncated to unsigned type [-Woverflow]

上:

    const unsigned char clsXMLnode::mcucAttrMacroDelimiter = '£';

再说一遍,为什么?根据谷歌搜索,这可能是一条虚假消息。

我很高兴地说,这已经解决了问题,解决方案,将检查字符声明为无符号字符,并使用:

    const char cCheck = strModified.at(intClB + 1).toLatin1();

我认为因为"£"不是ASCII表,所以您会从"char"中得到奇怪的行为。Xcode中的编译器甚至不允许我编译

char c = '£'; error-> character too large for enclosing literal type

您可以使用unicode,因为在unicode字符表中可以找到"£"£:u+00A3 | 12月:163日。

这个问题的答案极大地启发了我写的提取"£"十进制值的代码。

#include <iostream>
#include <codecvt>
#include <locale>
#include <string>
using namespace std;
//this takes the character at [index] and prints the unicode decimal value
u32string foo(std::string const & utf8str, int index)
{
  std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv;
  std::u32string utf32str = conv.from_bytes(utf8str);
  char32_t u = utf32str[index];
  cout << u << endl;
  return &u;
}
int main(int argc, const char * argv[]) {
  string r = "[y]£trainstrip+[height]£trainstrip+8";
  
  //compare the characters at indices 3 and 23 since they are the same
  cout << (foo(r,3) == foo(r, 23)) << endl;
  return 0;
}

如果需要,可以使用for循环来获取字符串中的所有字符。希望这能帮助