【问题标题】:Unicode in QML/C++ issueQML/C++ 中的 Unicode 问题
【发布时间】:2013-12-18 07:13:19
【问题描述】:

在 QML 中,我有一个 TextArea。当我将此 TextArea 的文本属性设置为“ÆØÅ”时,它会在程序运行时显示“ÆØÅ”。

我还通过一些我想在同一个 TextArea 中显示的函数获取文本,但是“ÆØÅ”显示为“???”。

字符串来自这个 C++ 函数:

QString Tts::morseToChar(QString morse)
{
    if(morse == ".-")               return "A";
    else if (morse == "-...")       return "B";
    ...
    ...
    else if (morse == ".-.-")       return "Æ";
    else if (morse == "---.")       return "Ø";
    else if (morse == ".--.-")      return "Å";
}

返回字符串被添加到 QML 字符串中:

property string ttsChar: ""
ttsChar += ttsSpeak.morseToChar(morse)
_ttsTextArea.text += ttsChar

所有文件都保存为 UTF-8。

我缺少什么转换才能使其正常工作?

【问题讨论】:

  • 在代码中直接使用非 ASCII 字符和字符串文字是个坏主意。它不可移植且不可扩展。首选在运行时从文本文件加载。
  • 这个应用程序仅供一个人在一台机器上使用,所以如果没有必要(即使是一个好主意/提示),我想保持简单。
  • 看,它甚至不能扩展到一台机器上的一个人。
  • 我明白你的意思。我会试试你的方法=)

标签: c++ unicode qml


【解决方案1】:

尝试返回 universal character name 而不是 utf-8 表示。

QString Tts::morseToChar(QString morse)
{
    if(morse == ".-")               return "A";
    else if (morse == "-...")       return "B";
    ...
    ...
    else if (morse == ".-.-")       return u8"\u00C6";
    else if (morse == "---.")       return u8"\u00D8";
    else if (morse == ".--.-")      return u8"\u00C5";
}

您可以搜索通用字符名称here,这是找到Æ (\00C6)Ø (\00D8)Å (\00C5) 名称的位置。

请参阅this answer,了解有关为什么 c++ 源文件中不允许使用 utf-8 表示的更多信息。

【讨论】:

    【解决方案2】:

    来自char *default constructor for QStrings 使用fromAscii() 函数。

    您的字符串可能实际上是用 UTF-8 编码的,所以有两件事可以尝试:-

    a :返回宽字符:

    return L"Æ";
    

    b:或者,从 UTF8 显式转换

     return QString::fromUtf8("Æ");
    

    【讨论】:

    • 我在询问之前尝试返回宽字符,但得到错误:C2664: 'QString::QString(QChar)' : cannot convert parameter 1 from 'const wchar_t [2]' to 'QChar' No构造函数可以采用源类型,或者构造函数重载决议不明确。我尝试了您的替代方案 b),但这也没有任何区别。
    猜你喜欢
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2011-07-26
    • 1970-01-01
    • 2012-06-02
    • 2016-11-26
    • 2012-03-29
    相关资源
    最近更新 更多