2010-01-20 3 views
2

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

Мой код выглядит следующим образом:

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

Пожалуйста, проверьте the answer в this question.


Edited добавить

Как вы говорите, что выше ответ относится к преобразованию RTF в PlainText, согласно RTF Specification 1.6 использовать \u261a для отображения ą, \u281e для ę ...

Синтаксис: \ u Nd, где N - десятичное значение Юникода для символа, а 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 
+0

Я прочитал этот вопрос. Это относится к конвертации в другую сторону. – jlp

+0

Я не хочу конвертировать RTF в обычный текст. Я хочу загрузить RTF-файл, заменить что-то и сохранить изменения. Проблема в том, что текст, который я хочу вставить, это UTF8 (я полагаю), а RTF - ASCI. Поэтому в какой-то момент мне нужно изменить кодировку. Я не знаю, когда и как. – jlp

1

Я использовал пример кода из ответа Пауло Сантоса, но:
- в 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(); 
} 
Смежные вопросы