Вставить строку со специальными символами в RTF - PullRequest
2 голосов
/ 20 января 2010

Как программно вставить строку со специальными символами в RTF? У меня есть шаблон RTF, я загружаю в строку, а затем заменить все $MY_VARIABLE$ с данными. Данные содержат специальные символы, такие как 'ąęść', и проблема в том, что в файле результатов эти символы заменяются на '?' Что-то не так с кодировкой, но что?

Мой код выглядит так:

StreamReader reader = new StreamReader("template.rtf");
StringBuilder form = new StringBuilder(reader.ReadToEnd());
// here I replace variables in rtf with data
Encoding srcEncoding = new UTF8Encoding();
Encoding dstEncoding = new ASCIIEncoding();
byte[] utf = srcEncoding.GetBytes(form.ToString());
byte[] asci = Encoding.Convert(Encoding.UTF8, Encoding.ASCII, utf);
return dstEncoding.GetString(asci);

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

Я использовал пример кода из ответа Пауло Сантоса, но:
- в C #
- улучшено кодирование символов '{', '}', '\' и '\ n'
- без сложной части RemoveDiacritics (), потому что слишком сложный для меня и моего позорного решения (просто поставьте «?» в качестве ascii-приближения) сработал для моих нужд (rtf в RichEditControl DevExpress) Это конечно глючит, но работает с '€' или '' '.

public static string GetRtfEncoding(char c)
{
    if (c == '\\') return "\\\\";
    if (c == '{') return "\\{";
    if (c == '}') return "\\}";
    if (c == '\n') return "\r\n\\line ";
    int intCode = Convert.ToInt32(c);
    if (char.IsLetter(c) && intCode < 0x80)
    {
        return c.ToString();
    }
    return "\\u" + intCode + "?";   
}
public static string GetRtfString(string s)
{
    StringBuilder returned = new StringBuilder();
    foreach(char c in s)
    {
        returned.Append(GetRtfEncoding(c));
    }
    return returned.ToString();
}
2 голосов
/ 20 января 2010

Пожалуйста, отметьте ответ на этот вопрос .


Отредактировано для добавления

Поскольку вы говорите, что приведенный выше ответ относится к преобразованию RTF в обычный текст, согласно Спецификация RTF 1.6 вы используете \u261a для отображения ą, \u281e для ę .. .

Синтаксис: \ u Nd , где N - десятичное значение Unicode для символа, а d - приближение ASCII.


Отредактировано для уточнения

Для того, что вы говорите, у вас есть некоторые заполнители в RTF, верно?

Вам нужно иметь функцию, которая при замене заполнителей добавляет правильные символы в кодировке RTF.

После небольшого исследования, я думаю, вы можете использовать что-то вроде этого:

Public Function GetRtfString(ByVal text As String) As String

  Dim sb As New Text.StringBuilder()
  For Each c As Char In text
    Dim code = Convert.ToInt32(c)
    If (Char.IsLetter(c) AndAlso code < &H80) Then
      sb.Append(c)
    Else
      sb.AppendFormat(CultureInfo.InvariantCulture, "\u{0}{1}", code, RemoveDiacritics(c))
    End If
  Next
  Return sb.ToString()

End Function

Public Function RemoveDiacritics(ByVal text As String) As String

  Dim formD = text.Normalize(System.Text.NormalizationForm.FormD)
  Dim sb As New Text.StringBuilder()

  For Each c As Char In formD
    If (CharUnicodeInfo.GetUnicodeCategory(c) <> UnicodeCategory.NonSpacingMark) Then
      sb.Append(c)
    End If
  Next

  Return sb.ToString().Normalize(System.Text.NormalizationForm.FormC)

End Function
...