2017-05-25 40 views
3

我正在編寫Java代碼來處理從包含需要被其他特殊字符替換的特殊字符的大型機接收的字符串,我的搜索字符是§ÄÖÜäüßö@[\]~{¦}和替換字符@[\]{}~¦§ÄÖÜßäöü所以如果字符串中有一個{我需要ä來代替它,比如我輸入的是"0.201322.05.2017LM-R{der Dopp"處理需要被其他特殊字符替換的特殊字符的Java代碼

我的代碼目前是

 String repChar = "§ÄÖÜäüßö@[\\\\]~{¦}@[\\\\]{}~¦§ÄÖÜßäöü"; 
     // Split String and Convert 
     String repCharin = repChar.substring(0, repChar.length()/2-1); 
     String repCharout = repChar.substring(repChar.length()/2, repChar.length()-1);   
     String strblob = new String(utf8ContentIn); 
     // Convert 
     for (int j=0; j < repCharin.length();j++) { 
      strblob = strblob.replace(repCharin.substring(j, 1), repCharout.substring(j, 1));        
     } 
     byte [] utf8Content = strblob.getBytes(); 

但它會生成以下呃在 java.lang.String.substring(String.java:1240)ROR

java.lang.StringIndexOutOfBoundsException

的\\的轉義字符我只需要一個\

+0

由於您在更改字符串時通過字符串的長度進行循環,因此會出現錯誤。 – Shane

+1

哪行引發異常?我可以說是'strblob = strblob.replace(repCharin.substring(j,1),repCharout.substring(j,1));'可能是'strblob = strblob.replace(repCharin.substring(j,j + 1 ),repCharout.substring(j,j + 1));' –

+0

我會建議獲取這些字符的字節表示並完全以字節模式收集工作,而不是使用字符串操作。記住一些用多字節編碼的字符。 –

回答

1

代碼

String utf8ContentIn = "0.201322.05.2017LM-R{der Dopp"; 

    String repChar = "§ÄÖÜäüßö@[\\]~{¦}@[\\]{}~¦§ÄÖÜßäöü"; 
    // Split String and Convert 
    String repCharin = repChar.substring(0, repChar.length()/2); 
    String repCharout = repChar.substring(repChar.length()/2, repChar.length()); 
    String strblob = new String(utf8ContentIn); 

    String output = strblob.chars().mapToObj(c -> { 
     char ch = (char) c; 
     int index = repCharin.indexOf(c); 
     if (index != -1) { 
      ch = repCharout.charAt(index); 
     } 
     return String.valueOf(ch); 
    }).collect(Collectors.joining()); 

    System.out.println(output); 

將按照您的預期打印"0.201322.05.2017LM-Räder Dopp"。你在這裏的問題(除了在分離期間不正確的索引)是你應該迭代輸入字符串,而不是你的字符。因爲當您將Ä替換爲[並且將威脅[替換爲特殊字符並將其替換爲Ä時,可能會遇到情況。

而且,單反斜線應與單反斜線轉義,因此要獲得\你需要\\

希望它能幫助!