Я нарушу 'одну опцию по почте' запрос - извините, но какой инструмент использовать действительно зависит от того, каковы Ваши приоритеты.
Одна довольно стабильная библиотека gtkNode. Это использует простой, но мощный способ отобразить все виджеты GTK на Erlang и должно продолжить быть стабильным через выпуски. Это также работает хорошо с разработчиком GUI Поляны. Это активно сохраняется гуру Erlang Mats Cronqvist, но это - конечно, максимальные усилия.
WxWidgets очень перспективен и надо надеяться станет основной библиотекой GUI для Erlang, но это все еще в бета-версии, и интерфейс еще не стабилен, и никакие обещания обратной совместимости еще не сделаны.
Поэтому, если Вы хотите быть немного на новейшем, WxWidgets может быть Вашей вещью. Иначе gtkNode должен дать Вам красивый GUI с относительной простотой и безопасностью.
единственная официально поддерживаемая библиотека GUI для Erlang GS, часть выпуска OTP и гарантирована работать с предстоящими выпусками. Таким образом, если это более важно, чем собственный стиль и современно выглядящий фасад, это может быть опция.
Мне пришлось сделать это недавно, и я заметил те же самые наблюдения, которые вы делаете.
Кажется, что, несмотря на то, что почти предлагает MSDN, парсер "RTF" будет работать только с 8-битными кодировками. В итоге я использовал UTF-8 , который является 8-битной кодировкой, но все же может представлять полный диапазон символов Unicode. Вы можете получить UTF-8 из PWSTR
через WideCharToMultiByte () :
PWSTR WideString = /* Some string... */;
DWORD WideLength = wcslen(WideString) + 1;
PSTR Utf8;
DWORD Length;
INT ReturnedLength;
// A utf8 representation shouldn't be longer than 4 times the size
// of the utf16 one.
Length = WideLength * 4;
Utf8 = malloc(Length);
if (!Utf8) { /* TODO: handle failure */ }
ReturnedLength = WideCharToMultiByte(CP_UTF8,
0,
WideString,
WideLength-1,
Utf8,
Length-1,
NULL,
NULL);
if (ReturnedLength)
{
// Need to zero terminate...
Utf8[ReturnedLength] = 0;
}
else { /* TODO: handle failure */ }
После того, как он будет установлен в UTF-8, вы можете:
SETTEXTEX TextInfo = {0};
TextInfo.flags = ST_SELECTION;
TextInfo.codepage = CP_UTF8;
SendMessage(hRichText, EM_SETTEXTEX, (WPARAM)&TextInfo, (LPARAM)Utf8);
И, конечно, (I изначально это не учитывалось, но пока я говорю прямо ...):
free(Utf8);
RTF - это ASCII, любой символ вне ASCII будет закодирован с использованием escape-последовательности. Спецификация RTF 1.9.1 (март 2008 г.)