【发布时间】:2021-12-13 20:14:14
【问题描述】:
我正在尝试在 RichEdit 中设置以下文本(我猜是 v2.0,因为我使用“Riched20.dll”库):
{\rtf1Привет!\par{ \i This } is super {\b text}.\par}
第一个问题是符号错误而不是非拉丁文本Привет,第二个问题是粗体文本部分{\\b text},它被渲染为非粗体。这是截图:
Visual Studio 设置为“使用 Unicode 字符集”(我正在开发的应用程序已经以这种方式设置,但我仍然对 Win 编码的工作方式很不满意)。我使用普通(例如非宽字符)std::string,因为宽字符类不适用于我的代码 - 那是我以前的 question。
这里是sn-p的代码:
DWORD CALLBACK EditStreamInCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)
{
std::stringstream* rtf = (std::stringstream*)dwCookie;
*pcb = rtf->readsome((char*)pbBuff, cb);
return 0;
}
// ...
auto hwndEdit = CreateRichEdit(hWnd, 100, 100, 300, 300, hInstance);
std::stringstream rtf("{\\rtf1Привет!\\par{ \\i This } is super {\\b text}.\\par}");
EDITSTREAM es = { 0 };
es.dwCookie = (DWORD_PTR)&rtf;
es.pfnCallback = &EditStreamInCallback;
SendMessage(hwndEdit, EM_STREAMIN, SF_RTF, (LPARAM)&es);
更新:最终目标是:从 JSON 中获取一些 RTF 字符串(可能包含 unicode(?) 文本、链接等),例如:
{
"text": "{\\rtf1Привет!\\par{ \\i This } is super {\\b text}.\\par}"
}
,显示它,处理超链接的点击,几乎可以肯定地修改特定符号(特定符号是自定义符号,它替换了我们自己修改的 .ttf 字体中的原始符号)。我还没有阅读 RTF 文档并使用给定的字符串来检查 RichEdit 控制和相应的 winapi 是如何工作的。
我想,最终的 RTF 文本将在 RTF 编辑器中形成。几乎可以肯定,写字板。
【问题讨论】:
-
RTF 格式并不完全正确,它需要正确的 Unicode 字体。您只需要 RTF 控件的初始化文本吗?这是否会被编辑/保存,它是否必须与写字板兼容? ...我还更新了以前的答案。
-
RTF 是一种严格的 ASCII 格式,您不能在其中存储 未编码 Unicode 字符。您需要使用适当的 RTF 转义码来处理 Unicode 字符(
\ansicpg、\u、\uc等)。见Unicode RTF。 -
@Jackdaw 这只会影响 RichEdit 是否可以处理一般的 Unicode 文本。它不会影响 Unicode 在实际 RTF 本身中的处理方式。