Unicode текст RTF в RichEdit

Я нарушу 'одну опцию по почте' запрос - извините, но какой инструмент использовать действительно зависит от того, каковы Ваши приоритеты.

Одна довольно стабильная библиотека gtkNode. Это использует простой, но мощный способ отобразить все виджеты GTK на Erlang и должно продолжить быть стабильным через выпуски. Это также работает хорошо с разработчиком GUI Поляны. Это активно сохраняется гуру Erlang Mats Cronqvist, но это - конечно, максимальные усилия.

WxWidgets очень перспективен и надо надеяться станет основной библиотекой GUI для Erlang, но это все еще в бета-версии, и интерфейс еще не стабилен, и никакие обещания обратной совместимости еще не сделаны.

Поэтому, если Вы хотите быть немного на новейшем, WxWidgets может быть Вашей вещью. Иначе gtkNode должен дать Вам красивый GUI с относительной простотой и безопасностью.

единственная официально поддерживаемая библиотека GUI для Erlang GS, часть выпуска OTP и гарантирована работать с предстоящими выпусками. Таким образом, если это более важно, чем собственный стиль и современно выглядящий фасад, это может быть опция.

8
задан 23 November 2009 в 11:00
поделиться

2 ответа

Мне пришлось сделать это недавно, и я заметил те же самые наблюдения, которые вы делаете.

Кажется, что, несмотря на то, что почти предлагает 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);
11
ответ дан 5 December 2019 в 12:59
поделиться

RTF - это ASCII, любой символ вне ASCII будет закодирован с использованием escape-последовательности. Спецификация RTF 1.9.1 (март 2008 г.)

1
ответ дан 5 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: