2016-11-30 65 views
2

我有這樣\n可見控制字符顯示的字符串,\t等 我試圖像here語錄,也是我試圖做類似如何使控制字符可見?

Pattern pattern = Pattern.compile("\\p{Cntrl}"); 
Matcher matcher = pattern.matcher(str); 
String controlChar = matcher.group(); 
String replace = "\\" + controlChar; 
result = result.replace(controlChar, replace); 

,但我失敗了

+1

通過控制字符,你僅僅意味着Java的轉義字符? –

回答

0

只是做

result = result.replace("\\", "\\\\"); 

將工作!

+0

你爲什麼這麼認爲?第一個是什麼''''? –

1

只需用轉義版本(即'\\n')取代的'\n' OCCURENCES,像這樣:

final String result = str.replace("\n", "\\n"); 

例如:

public static void main(final String args[]) { 
    final String str = "line1\nline2"; 
    System.out.println(str); 
    final String result = str.replace("\n", "\\n"); 
    System.out.println(result); 
} 

將產生輸出:

line1 
newline 
line1\nnewline 
3

替代方法:使用可見字符instea d的轉義序列。

爲了使控制字符 「可見」,使用的字符爲從Unicode Control Pictures塊,即地圖\u0000 - \u001F\u2400 - \u241F,和\u007F\u2421

請注意,這需要輸出爲Unicode,例如, UTF-8,而不是像ISO-8859-1這樣的單字節代碼頁。

private static String showControlChars(String input) { 
    StringBuffer buf = new StringBuffer(); 
    Matcher m = Pattern.compile("[\u0000-\u001F\u007F]").matcher(input); 
    while (m.find()) { 
     char c = m.group().charAt(0); 
     m.appendReplacement(buf, Character.toString(c == '\u007F' ? '\u2421' : (char) (c + 0x2400))); 
     if (c == '\n') // Let's preserve newlines 
      buf.append(System.lineSeparator()); 
    } 
    return m.appendTail(buf).toString(); 
} 

輸出使用上面的方法輸入文字:

␉private static String showControlChars(String input) {␍␊ 
␉␉StringBuffer buf = new StringBuffer();␍␊ 
␉␉Matcher m = Pattern.compile("[\u0000-\u001F\u007F]").matcher(input);␍␊ 
␉␉while (m.find()) {␍␊ 
␉␉␉char c = m.group().charAt(0);␍␊ 
␉␉␉m.appendReplacement(buf, Character.toString(c == '\u007F' ? '\u2421' : (char) (c + 0x2400)));␍␊ 
␉␉␉if (c == '\n')␍␊ 
␉␉␉␉buf.append(System.lineSeparator());␍␊ 
␉␉}␍␊ 
␉␉return m.appendTail(buf).toString();␍␊ 
␉}␍␊