如何在 QString 中检测非 ASCII 字符?

11

我希望检测用户在文件保存对话框中输入的非ASCII字符(也被错误称为Unicode字符),例如, り。由于我正在使用Qt,任何非ASCII字符都会被正确地保存在QString中,但在将字符串转换为ASCII之前,我无法确定该字符串中的任何字符是否是非ASCII字符。上面的那个字符最终被写入文件系统为ã‚Š


1
曾经我提出了一个isAscii()的建议,但是Thiago不喜欢。你本可以写成 "if (!myString.at(x).isAcii()); then... 我猜最终你会需要自己使用底层的isascii等函数。 - László Papp
你的意思是创建一个名为り的文件会保存为ã‚Š吗?如果是这样,你用什么工具创建这个文件? - Nazar554
2
ASCII字符是Unicode,但这有点迂腐。对于你的目的,任何值大于127(0x7F)的字符都是“Unicode”。 - Hot Licks
但请注意,您可以选择将文件编写为UTF8格式,在这种情况下(如果稍后使用相同属性进行读取),所有字符都将被保留。 - Hot Licks
4个回答

9

据我所知,Qt中没有这样的内置功能。

大约1-2年前,我提出了一个isAscii()方法,为QString / QChar封装底层的Unix isacii()和相应的Windows函数,但被拒绝了。你可以像下面这样编写代码:

bool isUnicode = !myString.at(3).isAcii();

我认为如果你能说服维护者的话,这将是一个方便的功能。除此之外,恐怕你还需要自行检查ASCII边界。你可以按照以下方式进行检查:
bool isUnicode = myChar.unicode() > 127; 

详见文档:

ushort QChar::unicode () const

这是一个重载函数。

(注:该函数返回字符的Unicode值,类型为unsigned short。)

9
最简单的方法是检查每个字符的代码(QChar::unicode()),以确保它们低于128,如果你需要纯7位ASCII

4

为了不使用循环的紧凑方式编写代码,您可以使用正则表达式:

bool containsNonASCII = myString.contains(QRegularExpression(QStringLiteral("[^\\x{0000}-\\x{007F}]")));

0

这对我有效: isLetterOrNumber()

ot_id += QChar((short) b.to_ulong()).isLetterOrNumber() ? QChar((short) b.to_ulong()) : QString("");

1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接