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

Extract character from QString and compare

我正在尝试比较 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 引用更改为 unsigned char,现在我收到警告:

    large integer implicitly truncated to unsigned type [-Woverflow]

在:

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

再一次,为什么?根据 google 搜索,这可能是一条虚假消息。

我很高兴地说这已经解决了问题,解决方法是将校验字符声明为 unsigned char 并使用:

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

我认为因为 '£' 不是 ASCII table,你会从 'char' 得到奇怪的行为。 Xcode中的编译器甚至都不让我编译

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

您可以使用 unicode,因为可以在 Unicode 字符上找到“£”table £:你+ 00A3 |十二月:163.

The answer to this question 极大地启发了我编写的提取“£”小数值的代码。

#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 循环获取字符串中的所有字符。希望这有帮助