Unicode RTF text in RichEdit

前端 未结 3 1521
孤独总比滥情好
孤独总比滥情好 2020-12-15 11:40

I\'m having trouble getting a RichEdit control to display unicode RTF text. My application is Unicode, so all strings are wchar_t strings.
If I create the control as \"R

相关标签:
3条回答
  • 2020-12-15 12:28

    RTF is ASCII, any charactor out of ASCII would be encoded using escape sequence. RTF 1.9.1 specification (March 2008)

    0 讨论(0)
  • 2020-12-15 12:29

    I had to do this recently, and noticed the same sorts of observations you're making.

    It seems that, despite what MSDN almost suggests, the "RTF" parser will only work with 8-bit encodings. So what I ended up doing was using UTF-8, which is an 8 bit encoding but still can represent the full range of Unicode characters. You can get UTF-8 from a PWSTR via 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 */ }
    

    Once you have it in UTF-8, you can do:

    SETTEXTEX TextInfo = {0};
    
    TextInfo.flags = ST_SELECTION;
    TextInfo.codepage = CP_UTF8;
    
    SendMessage(hRichText, EM_SETTEXTEX, (WPARAM)&TextInfo, (LPARAM)Utf8);
    

    And of course (I left this out originally, but while I'm being explicit...):

    free(Utf8);
    
    0 讨论(0)
  • 2020-12-15 12:29

    Take a look at \uN literal in rtf specification so you have to convert your wide string to string of unicode characters like \u902?\u300?\u888? http://www.biblioscape.com/rtf15_spec.htm#Heading9 The numbers in this case represent the characters decimal code and the question mark is the character which will replace the unicode char in case if RichEdit does not support unicode (RichEdit v1.0).

    For example for unicode string L"TIME" the rtf data will be "\u84?\u73?\u77?\u69?"

    0 讨论(0)
提交回复
热议问题