5

TRichEdit と TLMDRichEdit を使用して編集された、RTF を多用する Delphi 2009 のアプリケーションに取り組んでいます。これらの RTF コントロールに日本語テキストを入力したユーザーは、東方言語サポートがインストールされている Win XP と Vista の両方で、コンテンツをリロードすると日本語テキストが意味不明に表示されるという断続的なレポートを送信しています。

通常、英語と日本語が混在しており、ほとんど問題なく表示されます。次に例を示します。

Inventory turns partnerships.  在庫回転率の

(日本語のテキストが間違って壊れている場合は申し訳ありません - 私はその言語を話したり読んだりしません)。

ただし、非常に頻繁に、テキストの日本語部分だけが意味不明になります。たとえば、次のようになります。

ŒÉñ?“]-¦Œüã‚Ì·•ʉ?-vˆö‚ðŽû‰v‚ÉŒø‰?“I‚ÉŒ‹‚т‚¯‚é’mޝ‚ª‘÷Ý‚·‚é?(マーケットセクター、
見込み客の優  先順位と彼らに販売する知識)

広範なオンライン検索から、問題は RTF の一部として保存されたフォントの結果であると思われます。Windows の日本語版に存在するフォントは、米国英語版と必ずしも同じではありません。RTF ファイル内のフォントをプログラムで置き換えることが可能であり、ほとんど許容できる結果が得られます。

-D‚‚スƒIƒyƒŒ[ƒVƒ・“‚ニƒƒWƒXƒeƒBƒbƒN‚フƒpƒtƒH[ƒ}ƒ“ƒX‚-˜‰v‚ノŒ‹‚ム‚ツ‚ッ‚ネ‚「‚±ニ‚ヘ?A‘‚「‚ノ-ウ‘ハ‚ナ‚ ‚驕B‚サ‚‚ヘAl“セ‚オ‚ス・‘P‚フˆロ‚ƒƒXƒN‚ノ‚ウ‚‚キB

ただし、日本語の文字として正しく認識されない「ジャンク」文字がまだかなりの数あります。生の RTF を見ると、次のように表示されます。

-D\'82\'82\u65405?\'83I\'83y\'83\'8c[\'83V\'83\u12539?\ldblquote\'82\u65414?

明らかに、Unicode 文字は正しく表示されますが、たとえば、\'82\'82 の文字のペアは別のものである必要がありますか? 私の推測では、実際にはある種の 2 バイト文字を表していると思われます。これは、不思議な理由で、1 つの Unicode 文字ではなく 2 つの別個の文字としてエンコードされたものです。

東方言語を含む RTF を取得し、確実に再表示する一般的な (比較的) 確実な方法はありますか?

完全を期すために、RTF フォント テーブルを次のように更新しました。

  • フォント名「?l?r ?o?S?V?b?N;」を置き換え 「\'82\'6c\'82\'72 \'82\'6f\'83\'53\'83\'56\'83\'62\'83\'4e;」
  • 「\froman\fprq1\fcharset0」を「\fnil\fprq1\fcharset128」に置き換えてフォント名を更新
  • 「\froman\fprq1\fcharset238」を「\fnil\fprq1\fcharset128」に置き換えてフォント名を更新
  • 「\froman\fprq1」を「\fnil\fprq1\fcharset128」に置き換えてフォント名を更新
  • フォント名の置き換え "?? ?????;" 「\'82\'6c\'82\'72 \'82\'6f\'83\'53\'83\'56\'83\'62\'83\'4e;」

更新: フォント名だけを更新しても違いはありません。ロケールが大きな問題のようです。日本語の RTF の表示をほとんどの読者が扱えるものに変換する方法について議論しているサイトをいくつか見たことがありますが、まだ解決策を見つけていません。たとえば、 ここここを参照してください。

4

2 に答える 2

1

私の推測では、RTF でフォント名を変更すると、おそらく状況が悪化したと思われます。RTF で指定されたフォントが Unicode フォントでない場合、そのフォントでレンダリングされる文字は、Unicode ではなく Shift-JIS としてエンコードされます。そして、テキスト内の他のキャラクターも同様です。したがって、全体を Unicode として扱うか、Unicode テキストを追加すると、表示される破損が発生します。インポートする RTF が Shift-JIS または Unicode でエンコードされているかどうか、および実行しているマシン (したがって D2009 のデフォルトの入力形式) が日本語かどうかを確認する必要があります。日本では、テキスト ファイルに Unicode BOM がない場合、通常は Shift-JIS になります (常にではありません)。

于 2009-05-01T09:12:20.067 に答える
1

似たようなものを見ていましたが、日本語フォントではありませんでした。マイクロ (マイクロリットルなど) や上付き文字などの特殊文字のみ。問題は、ASP.NET Web ページからユーザーに送信した RTF 文字列が正しい (Fiddler2 を使用してエンコードされた RTF ストリームを確認できた) にもかかわらず、MS Word が実際に RTF を開いたときに、大量のガベージ エスケープが追加されたことです。あなたのサンプルに見られるようなコード。

私がしたことは、ASCII 127 を介してすべての文字を特別な Unicode ポイントに相当するものに交換する変換ルーチンを介して、RTF テキスト全体を実行することでした。だから私は\uc1\u181のようなものを得るでしょうか? (マイクロ) 特殊文字の場合。私がそれをしたとき、Wordは問題なくファイルを開くことができました. 皮肉なことに、\uc1\uxxx? RTFエスケープされた同等のものに戻ります。

Private Function ConvertRtfToUnicode(ByVal value As String) As String

    Dim ch As Char() = value.ToCharArray()
    Dim c As Char
    Dim sb As New System.Text.StringBuilder()
    Dim code As Integer

    For i As Integer = 0 To ch.Length - 1
        c = ch(i)
        code = Microsoft.VisualBasic.AscW(c)
        If code <= 127 Then
            'Don't need to replace if one of your typical ASCII codes
            sb.Append(c)
        Else
            'MR: Basic idea came from here http://www.eggheadcafe.com/conversation.aspx?messageid=33935981&threadid=33935972
            '  swaps the character for it's Unicode decimal code point equivalent
            sb.Append(String.Format("\uc1\u{0:d}?", code))
        End If
    Next

    Return sb.ToString()

End Function

それがあなたの問題に役立つかどうかはわかりませんが、私にとってはうまくいっています。

于 2009-05-05T23:05:46.520 に答える