2016-04-21 15 views
0

Ich möchte jeden Text parsen und es in RTF-Format codieren, fand ich eine einfache Lösung nur Text in einige "grundlegende Vorlage" zu setzen.Escape-Text von verschiedenen Zeichensatz zu RTF-Formatierung

Dies funktioniert, bis der Text keine Sonderzeichen enthält.

Ich muss in der Lage, Japanisch, Chinesisch, Russisch, Latein Sonderzeichen ... etc.

Zum Beispiel dies zu entkommen.

追 伸 次 回 の 発 表 が 気 に な る 場合は, こ ち ら を ご 確認 く だ さ い

sollte dies entwertet werden.

\ '92 \ 'c7 \ '90 \' 4c \ '81 \ '42 \ '8e \' 9f \ '89 \ 'f1 \ '82 \' cc \ '94 \ 'ad \ '95 \' 5c \ '82 \ 'aa \' 8b \ '43 \ '82 \ 'c9 \ '82 \' c8 \ '82 \ 'e9 \' 8f \ 'ea \' 8d \ '87 \ '82 \ 'cd \ '81 \ '41 \ '82 \' b1 \ '82 \ 'bf \ '82 \' e7 \ '82 \ 'f \ \ '82 \' b2 \ '8a \' 6d \ '94 \ '46 \ '82 \ ' ad \ '82 \ 'sein \ '82 \' b3 \ '82 \ 'a2 ​​\ '81 \ '42 \

gibt es eine Bibliothek für C#, die damit umgehen können, oder gibt es eine einfache Lösung, wie um das zu erreichen?

Antwort

0

Sie müssen sich mit verschiedenen Zeichen befassen, was nicht einfach ist.

Zuerst müssen Sie die Zeichencodierung in die Sprache konvertieren, die Sie benötigen, z. B. GB2312 für Chinesisch, und dann den Zeichenwert in Hexadezimalzeichenfolge konvertieren.

Der einfachste Weg ist, sie zu konvertieren, anstatt zu Unicode, die von heute RTF-Leser unterstützt:

Hier ist ein Code in Java und soll es zu C# public static String escape (String s) leicht zu konvertieren { if (s == null) gibt s zurück;

 int len = s.length(); 
     StringBuilder sb = new StringBuilder(len); 
     for (int i = 0; i < len; i++){ 
      char c = s.charAt(i); 
      if (c >= 0x20 && c < 0x80){ 
       if (c == '\\' || c == '{' || c == '}'){ 
        sb.append('\\'); 
       } 
       sb.append(c); 
      } 
      else if (c < 0x20 || (c >= 0x80 && c <= 0xFF)){ 
       sb.append("\'"); 
       sb.append(Integer.toHexString(c)); 
      }else{ 
       sb.append("\\u"); 
       sb.append((short)c); 
       sb.append("??");//two bytes ignored 
      } 
     } 
     return sb.toString(); 
    } 
1

C# Version von Yongtao Wang Antwort:

public static string Escape(string s) 
{ 
    if (s == null) return s; 

    var sb = new StringBuilder(); 
    foreach (char c in s) 
    { 
     if (c >= 0x20 && c < 0x80) 
     { 
      if (c == '\\' || c == '{' || c == '}') 
      { 
       sb.Append('\\'); 
      } 
      sb.Append(c); 
     } 
     else if (c < 0x20 || (c >= 0x80 && c <= 0xFF)) 
     { 
      sb.Append($"\\'{((byte)c).ToString("X")}"); 
     } 
     else 
     { 
      sb.Append($"\\u{(short)c}?"); 
     } 
    } 
    return sb.ToString(); 
} 

Wenn die Zeichenfolge Zeilenumbrüche enthalten können, müssen Sie auch diese Methode aufrufen, bevor die maskierten String Rückkehr:

private static string FixLineBreaks(string str) 
{ 
    return str.Replace(@"\'d\'a", @"\line "); 
}