1

我在我的 C++ Qt 项目中使用 QScintilla 作为文本编辑器,并希望为我的自定义(ish)语言突出显示语法。

根据我找到的一个很好的指南(qscintilla),我将 QsciLexerCustom 子类化并实现了所有必要的方法,特别是QsciLexerCustom::styleText. 一切似乎都很好,直到我在编辑器中写了一个非 ASCII 字符,这使得突出显示被转移。经过一番调查,我发现密钥最有可能出现在不同字符长度的 UTF8 中。这是我的 styleText 方法的开始:

void TemplateHighlighter::styleText(int start, int end)
{
    startStyling(start);

    const auto editor = qobject_cast<QsciScintilla*>(parent());
    mText = editor->text(start, end);
    mTextPos = 0;

    // do the work
}

现在例如,如果编辑器包含非 ASCII 文本,如,则使用andč-č-č调用 styleText 方法,因为这是 Scintilla UTF-8 缓冲区的大小(3x 2B 加上 2x 1B)。但是我从编辑器得到的这个范围的 QString 只有 5 个字符。因此,当我使用 为整个字符串设置样式时,这还不够,因为这意味着我没有为我要求的所有内容设置样式,至少最后一个不会被设置样式。start == 0end == 8setStyling(5, Styles::Example)č

我试图想办法解决这个问题,但真的看不到任何合理的选择,如果我想坚持使用 QStrings 并且不想使用原始缓冲区,这将使我的整个词法分析器实现无用。有什么我想念的吗?或者一些或多或少合理的解决方法?

4

0 回答 0