2016-04-21 10 views
0

Я хотел бы разобрать любой текст и закодировать его в формате RTF, я нашел простое решение просто поместить текст в какой-нибудь «базовый шаблон».Исключить простой текст разных кодировок для RTF-форматирования

Это работает ОК, пока текст не содержит специальных символов.

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

Например, это:.

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

должны быть экранированы на это:.

\ '92 \ 'c7 \ '90 \' 4c \ '81 \ '42 \ '8e \' 9f \ '89 \ 'f1 \ '82 \' cc \ '94 \ 'ad \ '95 \' 5c \ '82 \ 'аа \' 8b \ '43 \ '82 \ 'с9 \ '82 \' c8 \ '82 \ 'e9 \' 8е \ 'еа \' 8г \ '87 \ '82 \ 'CD \ '81 \ '41 \ '82 \ 'б1 \ '82 \' бф \ '82 \ 'е7 \ '82 \' f0 \ '82 \ 'b2 \' 8а \ '6d \ '94 \ '46 \ '82 \' объявление \ '82 \ 'быть \ '82 \' b3 \ '82 \ 'a2 ​​\ '81 \ '42 \

есть ли библиотека для C#, которые могли бы справиться с этим, или есть простое решение, как для достижения этой цели?

ответ

0

Вам нужно иметь дело с различными наборами символов, которые не просто.

Во-первых, вам нужно преобразовать кодировку charcter на нужный вам язык, например GB2312 для китайского, а затем преобразовать значение char в шестую строку.

Самый простой способ, чтобы преобразовать их вместо того, чтобы в юникод, который поддерживается в наше время RTF читателей:

Вот код в Java и должны быть легко преобразовать его в C# общественного статического побеге Струнный (String s) { if (s == null) return 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

C# версия ответа Yongtao Ванга:

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

Если строка может содержать переносы строк, вы также должны вызвать этот метод перед возвращением сбежавшей строки:

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

 Смежные вопросы

  • Нет связанных вопросов^_^