2015-10-18 28 views
1

我試圖讓功能,將刪除變音符號(不想使用正規化的目的)。功能看起來像的Java刪除變音

private static String normalizeCharacter(Character curr) { 
    String sdiac = "áäčďéěíĺľňóôőöŕšťúůűüýřžÁÄČĎÉĚÍĹĽŇÓÔŐÖŔŠŤÚŮŰÜÝŘŽ"; 
    String bdiac = "aacdeeillnoooorstuuuuyrzAACDEEILLNOOOORSTUUUUYRZ"; 
    char[] s = sdiac.toCharArray(); 
    char[] b = bdiac.toCharArray(); 
    String ret; 
    for(int i = 0; i < sdiac.length(); i++){ 
     if(curr == s[i]) 
      curr = b[i]; 
    } 
    ret = curr.toString().toLowerCase(); 
    ret = ret.replace("\n", "").replace("\r",""); 
    return ret; 
} 

funcion被稱爲像這樣(從文件中的每個charracter發送到該功能)

private static String readFile(String fName) { 

    File f = new File(fName); 
    StringBuilder sb = new StringBuilder(); 

    try{ 

     FileInputStream fStream = new FileInputStream(f); 
     Character curr; 
     while(fStream.available() > 0){ 
      curr = (char) fStream.read(); 
      sb.append(normalizeCharacter(curr)); 
      System.out.print(normalizeCharacter(curr)); 
     } 
    }catch(IOException e){ 
     e.printStackTrace(); 
    } 
    return sb.toString(); 
} 

文件text.txt包含此:ľščťžýáíéúäôň,我希望lcstzyaieuaon從程序回報,但insted的預期字符串我得到這個¾è yaieuaoò。我知道這個問題在編碼的某個地方,但不知道在哪裏。有任何想法嗎 ?

+0

提示代碼質量:像sdiac,bdiac這樣的名字是很可怕的。給出事情的名稱,告訴他們是什麼。只需更改名稱即可使代碼更具可讀性!例如,爲什麼不把s和b變成常量? (所以不需要創建數組,並在任何時候拋出這些方法被調用)[我認爲這種方法可能被稱爲...好吧,經常?!] – GhostCat

+0

變量名稱是我的語言和這個東西只是測試階段,所以現在代碼的速度並不重要(至少對我而言)。只有10行代碼我相信every1會理解它。無論如何,你的帖子並沒有解決我的問題。但是thx – TomP

+3

您在此處編寫此代碼以供其他人閱讀**。所以你認爲如果它很容易閱讀或難以閱讀,這並沒有什麼不同。就像「其他人可以爲我工作,嘿,爲什麼我應該讓自己的生活更輕鬆」。 也許你最好再思考一下,如果這樣的思維模式是轉換的最佳起點。這甚至是出於您自己的利益:您希望人們關注您的**問題**;不瞭解源代碼。代碼越容易閱讀,越多的人會完全閱讀它來幫助你。閱讀越難,越多的人會轉身離開,而不是打擾。 – GhostCat

回答

2

您試圖將字節轉換爲字符。

但是,字符ľ未表示爲單個字節。它的unicode表示是U + 013E,其UTF-8表示是C4 BE。因此,它由兩個字節表示。其他角色也是如此。

假設您的文件的編碼是UTF-8。然後讀取字節值C4,然後將其轉換爲char。這將給你的字符U + 00C4(Ä),而不是 U + 013E。然後你讀BE,它被轉換成字符U + 00BE(¾。

所以不要混淆字節和字符。不要直接使用InputStream,而應該用Reader包裝它。一個Reader能夠根據它與創建編碼讀取charecters:

BufferedReader reader = new BufferedReader(
          new InputStreamReader(
           new FileInputStream(f), StandardCharsets.UTF_8 
          ) 
         ); 

現在,你就可以讀取字符,甚至整個線和編碼將被直接完成。

int readVal; 
while ((readVal = reader.read()) != -1) { 
    curr = (char)readVal; 
    // ... the rest of your code 
} 

記住,你還在讀書的int如果你打算使用read()不帶參數。

+0

是的,完全忘了讀取返回int ...感謝指出:) –