8

RichEditコントロールでUnicodeRTFテキストを表示するのに問題があります。私のアプリケーションはUnicodeなので、すべての文字列はwchar_t文字列です。
コントロールを「RichEdit20A」として作成すると、たとえばSetWindowTextを使用でき、テキストは適切な形式で表示されます。コントロールを「RichEdit20W」として作成すると、SetWindowTextを使用するとテキストが逐語的に表示されます。つまり、すべてのRTFコードが表示されます。EM_SETTEXTEXパラメーターを使用して、MSDNがユニコードを示すために使用されるとMSDNが指示するコードページ1200を指定した場合も、同じことが起こります。
StreamIn関数を使用してみましたが、これはASCIIテキストでストリーミングする場合にのみ機能するようです。widecharsでストリーミングすると、コントロールに空のテキストが表示されます。SF_RTF | SF_UNICODEフラグを使用していますが、MSDNはこの組み合わせが許可されていない可能性があることを示唆しています。

じゃあ何をすればいいの?RTFの解釈を失うことなくワイドチャーをRichEditに取り込む方法はありますか、それともエンコードする必要がありますか?UTF-8を試すか、RTFのエンコード機能を使用することを考えましたが、最適な選択が何であるかわかりません。

4

3 に答える 3

11

私は最近これをしなければなりませんでした、そしてあなたがしているのと同じ種類の観察に気づきました。

MSDNがほぼ示唆していることにもかかわらず、「RTF」パーサーは8ビットエンコーディングでのみ機能するようです。したがって、私がやったのはUTF-8を使用することでした。これは、8ビットエンコーディングですが、Unicode文字の全範囲を表すことができます。WideCharToMultiByte()PWSTRを介してUTF-8を取得できます。

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);

そしてもちろん(私は元々これを省略しましたが、私が明示している間は...):

free(Utf8);
于 2009-11-23T11:09:12.660 に答える
1

RTFはASCIIであり、ASCII以外の文字はエスケープシーケンスを使用してエンコードされます。 RTF 1.9.1仕様(2008年3月)

于 2009-11-23T17:14:54.387 に答える
1

rtf仕様の\uNリテラルを見てください。そのため、ワイド文字列を\ u902?\ u300?\ u888?のようなUnicode文字の文字列に変換する必要があります。 http://www.biblioscape.com/rtf15_spec.htm#Heading9 この場合の数字は10進コードの文字を表し、疑問符は、RichEditがUnicode(RichEdit v1)をサポートしていない場合にUnicode文字を置き換える文字です。 0)。

たとえば、Unicode文字列L "TIME"の場合、rtfデータは "\ u84?\ u73?\ u77?\ u69?"になります。

于 2011-10-19T15:04:30.870 に答える