2010-01-20 126 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 answerthis question


編輯補充

至於你說的是,以上的答案適用於RTF明文的轉換,根據RTF Specification 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 
+0

我已閱讀此問題。它適用於轉換其他方式。 – jlp 2010-01-20 11:33:41

+0

我不想將RTF轉換爲純文本格式。我想加載RTF文件,替換一些東西並保存更改。問題是我想要插入的文本是UTF8(我想)和RTF是ASCI。所以在某些時候我必須改變編碼。我不知道何時以及如何。 – jlp 2010-01-20 13:02:24

1

我用從聖保羅桑托斯的答覆代碼示例,但:
- 在C#中
- 提高編碼字符'{','}','\'和'\ n'
- 沒有複雜的RemoveDiacritics()部分,因爲對我而言太複雜,我的恥辱解決方案(只需將'?'ascii逼近)我的需求(DevExpress的RichEditControl中的rtf) 這肯定是有問題的,但它適用於'€'或'因'。

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