5

rtfに変換したいテキストファイルがたくさんあります。コードの拡張子を変更するだけでは機能せず、基になるファイルは同じです。テキストをrtf形式にする必要があります。誰かが私がこれを行う方法を知っていますか?

問題は、プレーンテキストファイルをロードすると、RichTextBoxが新しい行をフォーマットしないため、新しい行を挿入するのではなく、1つの連続したテキストブロックとしてロードすることです。

唯一の解決策は、プレーンテキストファイルを開いてrtfを「名前を付けて保存」することでした。

4

5 に答える 5

16

空のRTFテンプレートにテキストを追加するだけで、プレーンテキストにはフォーマットがありません。したがって、rtfテンプレートは次のようになります(ウィキペディアの例から)。

{\rtf1\ansi{\fonttbl\f0\fswiss Helvetica;}\f0\pard _TEXT_CONTENT_HERE_ }

更新:新しい行、中かっこ、円記号を忘れました:)

public static string PlainTextToRtf(string plainText)
{
  string escapedPlainText = plainText.Replace(@"\", @"\\").Replace("{", @"\{").Replace("}", @"\}");
  string rtf = @"{\rtf1\ansi{\fonttbl\f0\fswiss Helvetica;}\f0\pard ";
  rtf += escapedPlainText.Replace(Environment.NewLine, @" \par ");
  rtf += " }";
  return rtf;
}
于 2012-05-23T18:10:04.917 に答える
3

アントニオの改善された方法(コードページ\ ansicpg1250を定義したことに注意してください):

public static string PlainTextToRtf(string plainText)
{
    if (string.IsNullOrEmpty(plainText))
        return "";

    string escapedPlainText = plainText.Replace(@"\", @"\\").Replace("{", @"\{").Replace("}", @"\}");
    escapedPlainText = EncodeCharacters(escapedPlainText);

    string rtf = @"{\rtf1\ansi\ansicpg1250\deff0{\fonttbl\f0\fswiss Helvetica;}\f0\pard ";
    rtf += escapedPlainText.Replace(Environment.NewLine, "\\par\r\n ") + ;
    rtf += " }";
    return rtf;
}

文字のエンコード(ポーランド語)メソッド:

private static string EncodeCharacters(string text)
{
    if (string.IsNullOrEmpty(text))
        return "";

    return text
        .Replace("ą", @"\'b9")
        .Replace("ć", @"\'e6")
        .Replace("ę", @"\'ea")
        .Replace("ł", @"\'b3")
        .Replace("ń", @"\'f1")
        .Replace("ó", @"\'f3")
        .Replace("ś", @"\'9c")
        .Replace("ź", @"\'9f")
        .Replace("ż", @"\'bf")
        .Replace("Ą", @"\'a5")
        .Replace("Ć", @"\'c6")
        .Replace("Ę", @"\'ca")
        .Replace("Ł", @"\'a3")
        .Replace("Ń", @"\'d1")
        .Replace("Ó", @"\'d3")
        .Replace("Ś", @"\'8c")
        .Replace("Ź", @"\'8f")
        .Replace("Ż", @"\'af");
}
于 2013-01-31T09:10:37.973 に答える
0

複数の文字列の割り当てを回避しようとするZbignewWiadroの回答のバージョン(ポーランド語の文字を除く)。

 public static string Convert(string s)
{
  var ret = new StringBuilder((int) (71 + (s.Length * 1.1)));
  ret.Append(@"{\rtf1\ansi\ansicpg1250\deff0{\fonttbl\f0\fswiss Helvetica;}\f0\pard ");
  foreach (var letter in s)
  {
    switch (letter)
    {
      case '\\':
      case '{':
      case '}':
        ret.Append('\\');
        break;
      case '\r':
        ret.Append("\\par");
        break;
    }
    ret.Append(letter);
  }
  ret.Append(" }");
  return ret.ToString();
}

デザインはシンプルです。

  • StringBuilderから始めて、最終的な文字列にヘッダー、元のテキスト、および拡張用の10%のバッファーが含まれると推測します。これにより、文字列ビルダーが大きくなるにつれて、複数の配列コピーがなくなります。(私たちの推測が低い場合でも、1つの配列コピーを犠牲にして(おそらく)それは機能します。
  • ヘッダーを書き出す
  • 文字列をループし、1回のパスですべてのエスケープを実行します。
  • ポリッシュ変換を追加し直したい場合は、文字列のコピーではなく、switchステートメントのケースが増えるだけです。
  • 末尾の中括弧を書きます。
  • 文字列ビルダーを文字列にダンプします。
于 2019-03-17T07:13:06.367 に答える
0

私はうまくいくはずの方法を見つけました。テキストエディットでプレーンテキストファイル(.txt)を開きます。左上のメニューバーの[フォーマット]ドロップダウンをクリックします。[リッチテキストを作成]というボタンがあるはずです。それをクリックすると、すべてのテキストがリッチとしてフォーマットされます。ボタンを切り替えて、プレーンテキストにします。また、ファイルタイプを.rtfに変更します。Windowsを使用していない限り、これは最新のOSで動作するはずです。

于 2019-07-27T15:21:41.617 に答える
0

これが完全に機能する機能です。

すべての特殊文字をカバーしています(ポーランド文字だけでなく....)

public static string ConvertToRtf(string text)
{
    // using default template from wiki
    StringBuilder sb = new StringBuilder(@"{\rtf1\ansi\ansicpg1250\deff0{\fonttbl\f0\fswiss Helvetica;}\f0\pard ");
    foreach (char character in text)
    {
        if (character <= 0x7f)
        {
            // escaping rtf characters
            switch (character)
            {
                case '\\':
                case '{':
                case '}':
                    sb.Append('\\');
                    break;
                case '\r':
                    sb.Append("\\par");
                    break;
            }

            sb.Append(character);
        }
        // converting special characters
        else
        {
            sb.Append("\\u" + Convert.ToUInt32(character) + "?");
        }
    }
    sb.Append("}");
    return sb.ToString();
}
于 2020-05-14T13:01:37.380 に答える