使用 ImGui 显示更长的字符串 [关闭]

Posted

技术标签:

【中文标题】使用 ImGui 显示更长的字符串 [关闭]【英文标题】:Show longer String with ImGui [closed] 【发布时间】:2020-05-22 12:31:16 【问题描述】:

我正在使用 ImGui,OpenGL 的实现工作正常,但现在我在渲染一些文本时遇到了问题。出于某种原因,每当我尝试使用 ImGui::Text(someString.c_str()); 渲染字符串时,ImGui 只会渲染前 19 个字符。如果我尝试使用ImGui::Text("This is a Text longer than 19 characters") 呈现相同的文本,则 ImGui 会呈现整个文本。

我也用ImGui::TextUnformatted(&someString[0], &someString[someString.size()-1]); 进行了尝试,结果相同:前 19 个字符被显示,但其余字符被删除。

但如果我这样做 std::clog << someString.c_str() 它完全可以正常工作。

如果有人能发现我的错误,我会非常高兴,我尝试了很多小时但无法修复它。

【问题讨论】:

someString的内容是什么? 啊,这可能是问题所在:我使用了一个 'ü' 来终止字符串。 谢谢,这就是问题所在。 【参考方案1】:

问题是我从来没有使用另一个字符串的想法...... someString 的内容包含一个终止字符串的“ü”。但是为什么 'ü' 不能与 ImGui 一起使用是另一个问题。

【讨论】:

【参考方案2】:

为了让 ImGui 渲染非标准字符,您需要指定字体应该使用的字符范围,并指示 ImGui 在渲染该字体时使用 utf-8 编码。

根据你要显示的字符,你需要根据他们的utf-8代码页添加相关代码。大致如下:

const ImWchar*  ImFontAtlas::GetGlyphRangesPolish()

    static const ImWchar ranges[] =
    
        0x0020, 0x00FF, // Basic Latin + Latin Supplement
        0x00A0, 0x02D9, // Polish characters 
        0,
    ;
    return &ranges[0];

然后您需要将该范围添加到您要在程序中使用的字体中:

ImFont* font = io.Fonts->AddFontFromFileTTF("fonts/DroidSans.ttf", 17.0f, nullptr, io.Fonts->GetGlyphRangesPolish());

现在您可以在 ImGui 中使用额外导入的文本字符

ImGui::TextWrapped("łąężü");

如果你不使用这个方法,你会显示??????字符而不是您在 ImGui 中需要的字符。

【讨论】:

以上是关于使用 ImGui 显示更长的字符串 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用python正则表达式在字符串中搜索长度为6或更长的特定重复(mnr)

从字符串中获取 char * 或 const char * 数据会中断 16 个字符或更长的字符串

如何配置内存中的 Camunda 数据库以接受更长的字符串过程变量?

在更长的字符串中,如何在 PostgreSQL(和/或 Python 3)中将一个字符(例如,'a')和一个变音字符(例如,'U+030A')转换为单个字符('å')[重复]

为啥从组合框进行选择后切换图形需要更长的时间?

Imgui自定义中文字符集