【问题标题】:How can non-ASCII characters be detected in a QString?如何在 QString 中检测到非 ASCII 字符?
【发布时间】:2014-01-25 16:42:51
【问题描述】:

我想检测用户是否在文件保存对话框中输入了非 ASCII(否则错误地称为 Unicode)字符(例如,り)。当我使用 Qt 时,任何非 ASCII 字符都正确保存在 QString 中,但在将字符串转换为 ASCII 之前,我无法弄清楚如何确定该字符串中的任何字符是否为非 ASCII。上面的那个字符最终会以り 的形式写入文件系统。

【问题讨论】:

  • 曾经我有一个 isAscii() 提案,但 thiago 不喜欢它。你可以写“if (!myString.at(x).isAcii()); then...我猜你最终需要自己使用低级 isascii 等。
  • 你的意思是创建一个名为り的文件会保存为り?如果是这样,您使用什么来创建文件?
  • 好吧,ASCII 字符是 Unicode,但这有点迂腐。出于您的目的,任何值大于 127 (0x7F) 的字符都是“Unicode”。
  • 但请注意,您可以选择将文件写入为 UTF8,在这种情况下(如果以后使用相同的属性读取)将保留所有字符。

标签: c++ qt qstring qtcore qchar


【解决方案1】:

在我的理解中没有这样的内置功能。

大约 1-2 年前,我提出了一个用于 QString/QChar 的 isAscii() 方法来包装低级 Unix isacii() 和相应的 Windows 函数,但被拒绝了。你可以这样写:

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

如果您能说服维护者,我仍然认为这将是一个方便的功能。 :-)

除此之外,恐怕您需要自己检查 ascii 边界。您可以按如下方式自己执行此操作:

bool isUnicode = myChar.unicode() > 127; 

详见文档:

ushort QChar::unicode () const

这是一个重载函数。

【讨论】:

    【解决方案2】:

    如果您需要纯 7 位 ASCII,最简单的方法是检查每个字符的代码 (QChar::unicode()) 是否低于 128。

    【讨论】:

      【解决方案3】:

      要写得紧凑,不循环,可以使用正则表达式:

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

      【讨论】:

        【解决方案4】:

        这对我有用: isLetterOrNumber()

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

        【讨论】:

        • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-09
        • 2015-07-01
        • 1970-01-01
        相关资源
        最近更新 更多