2016-04-21 3 views
0

Je voudrais analyser n'importe quel texte et l'encoder au format RTF, j'ai trouvé une solution simple juste pour mettre du texte dans un «modèle de base».Échapper le texte brut des différents jeux de caractères au formatage RTF

Cela fonctionne correctement jusqu'à ce que le texte ne contienne aucun caractère spécial.

Je dois être en mesure d'échapper japonais, chinois, russe, caractères spéciaux latins ... etc.

Par exemple, ceci:.

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

doivent être protégés à ceci:.

\ '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 \' f0 \ '82 \ 'b2 \' 8a \ '6d \ '94 \ '46 \ '82 \' ad \ '82 \ 'être \ '82 \' b3 \ '82 \ 'a2 ​​\ '81 \ '42 \

y at-il pour la bibliothèque C# qui pourrait gérer cela, ou est-il une solution simple comment pour y parvenir?

Répondre

0

Vous devez gérer différents jeux de caractères, ce qui n'est pas facile. Tout d'abord, vous devez convertir le codage du charactère dans la langue dont vous avez besoin, comme GB2312 pour le chinois, puis convertir la valeur char en chaîne hexadécimale.

Le plus simple est de les convertir en unicode au lieu qui est pris en charge par nos jours lecteurs RTF:

Voici un code en Java et devrait être facile à convertir en C# évasion public static String (String s) { if (s == null) retourne s;

 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

version C# de la réponse de Yongtao Wang:

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

Si la chaîne peut contenir des sauts de ligne, vous aurez également besoin d'appeler cette méthode avant de retourner la chaîne échappée:

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