我在我的 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 == 0
end == 8
setStyling(5, Styles::Example)
č
我试图想办法解决这个问题,但真的看不到任何合理的选择,如果我想坚持使用 QStrings 并且不想使用原始缓冲区,这将使我的整个词法分析器实现无用。有什么我想念的吗?或者一些或多或少合理的解决方法?