从 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 循环获取字符串中的所有字符。希望这有帮助
我正在尝试比较 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 循环获取字符串中的所有字符。希望这有帮助