2016-07-31 45 views
1

我想用android工作室編碼詞彙應用程序。我有一個txt文件,其中包含UTF-8格式的詞彙。UTF-8編碼的日語字符不會出現在Android顯示

akarui _ あかるい _ bright

代碼讀取該文件,並添加到字典如下所示:

public Map<String, String> adjectives_ej = new HashMap<String, String>(); 
try { 
     InputStream in = am.open("adjectives_utf8.txt"); 
     //BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)); 
     StringBuilder sb = new StringBuilder(); 
     String line; 
     while ((line = br.readLine()) != null){ 
      // printout first line 
      if (line != ""){ 

       String[] parts = line.split("_"); 
       byte[] bytes = parts[1].getBytes("UTF-8"); 
       String japaneseString = new String(bytes, "UTF-8"); 
       Log.d("voc", japaneseString); 
       adjectives_ej.put(parts[2].replaceAll(" ",""), new String(bytes, "UTF-8")); 
       adjectives_je.put(new String(bytes, "UTF-8"), parts[2].replaceAll(" ","")); 
      } 

     } 
TextView textView = new TextView(this); 
textView.setText(adjectives_ej.get("bright")); 
ViewGroup layout = (ViewGroup)   
findViewById(R.id.activity_adjectives); 
layout.addView(textView); 

如果我想看到的​​輸出我得到的錯誤信息:

java.lang.RuntimeException: Unable to start activity ComponentInfo{ericwolf.genkiii/ericwolf.genkiii.Adjectives}: java.lang.NullPointerException: println needs a message

但是Log.d("voc", japaneseString);給了我正確的輸出:07-31 19:42:41.600 25439-25439/ericwolf.genkiii D/voc: くらい

此外在「while」循環內設置textView.setText(parts[1]);工作得很好。所以我不明白這裏的區別。將它保存在字典中有問題嗎?

+0

使用'按住Shift鍵JIS',而不是'UTF-8'。希望它能解決你的問題。 – SkyWalker

+0

可悲的不是:(同樣的錯誤,仍然沒有出現這個詞 –

+0

可能是一個編碼問題,你能分享'adjectives_utf8.txt'嗎? – selbie

回答

1

感謝您分享txt文件。它看起來很好。儘管它包含BOM,但我不認爲這會導致任何問題。

它的這些問題任何一個:

  1. 字體問題。也許您用來顯示的字體不支持亞洲字符集。

  2. 更可能的是,多重解碼/編碼從UTF8和回來。取而代之的是:

     String[] parts = line.split("_"); 
         byte[] bytes = parts[1].getBytes("UTF-8"); 
         String japaneseString = new String(bytes, "UTF-8"); 
         Log.d("voc", japaneseString); 
         adjectives_ej.put(parts[2].replaceAll(" ",""), new String(bytes, "UTF-8")); 
         adjectives_je.put(new String(bytes, "UTF-8"), parts[2].replaceAll(" ","")); 
    

認識到line已經從UTF8解碼爲BufferedReader中的結果。沒有理由將其編碼回UTF8只能再次解碼。我們還可以通過簡單的trim調用來清理replaceAll的東西。

因此改變上述這樣:

  String[] parts = line.split("_"); 
      String japaneseString = parts[1].trim(); 
      String englishString = parts[2].trim(); 

      Log.d("voc", japaneseString + " : " + englishString); 

      adjectives_ej.put(englishString, japaneseString); 
      adjectives_je.put(japaneseString, englishString); 
+0

非常感謝你!工作得很好! :) –

+0

謝謝。如果它適合你,請不要忘記「接受」答案(綠色選中標記)。 – selbie