2013-02-14 47 views
3

美好的一天。擴展ascii表的ReadLine和編碼

我有一個帶有西班牙文單詞的ASCII文件。它們只包含A和Z之間的字符,再加上Ñ,ASCII碼165(http://www.asciitable.com/)。 我得到這個文件,這個源代碼:

InputStream is = ctx.getAssets().open(filenames[lang_code][w]); 
InputStreamReader reader1 = new InputStreamReader(is, "UTF-8"); 
BufferedReader reader = new BufferedReader(reader1, 8000); 

try { 
    while ((line = reader.readLine()) != null) { 
       workOn(line); 
       // do a lot of things with line 
      } 
    reader.close(); 
    is.close(); 
} catch (IOException e) { e.printStackTrace(); } 

這裏我叫workOn()是應該提取字符串中的字符代碼和有點像一個函數:

private static void workOn(String s) {  
    byte b; 
    for (int w = 0; w < s.length(); w++) { 
     b = (byte)s.charAt(w); 
        // etc etc etc 
      } 
} 

不幸這裏發生的是,當它代表Ñ字母時,我無法將b標識爲ASCII碼。對於任何ASCII字母,b的值都是正確的,並且在處理Ñ,帶符號,253或ASCII字符²時返回-3。沒有類似於Ñ...

這裏會發生什麼?我應該如何獲得這個簡單的ASCII碼?

讓我發瘋的是我無法找到正確的編碼。即使如果我去瀏覽UTF-8表(http://www.utf8-chartable.de/)Ñ是209dec和253dec是ý,165dec是¥。再次,不是我需要的事件親屬。

所以......請幫助我! :(

+1

你可以看看你的文件在十六進制編輯器或顯示生字節?我懷疑253不是你在一個文件中的字節(因爲你正在閱讀流爲UTF-8) – 2013-02-14 22:55:38

+0

是的可能...這是我的問題實際上:/ – 2013-02-14 23:00:43

+0

正如你建議我,我用一個十六進制編輯器,我在文件中的字符有編碼209. – 2013-02-14 23:07:26

回答

8

您確定您正在閱讀的源文件是UTF-8編碼嗎?在UTF-8編碼中,所有大於127的值都保留爲多字節序列,並且他們從未見過站在他們的自己的。

我的猜測是,你正在閱讀使用「代碼頁237」,這是原IBM PC的字符集編碼。在這種字符集,n爲十進制表示的文件165

許多現代系統使用ISO-8859-1,它恰好等同於Unicode字符集的前256個字符,其中,Ñ字符是小數點209.在評論中,作者澄清說209實際上在該文件。

如果該文件是真的UTF-8編碼的,則N將被表示爲兩個字節的序列,並且將是既不是值165,也沒有基於上述假設的值209

,所述文件是ISO-8859-1編碼的,你應該能夠通過解決情況:

InputStreamReader reader1 = new InputStreamReader(is, "ISO-8859-1"); 

這將轉換爲Unicode字符,然後你應該找到的字符用十進制209

代表
+0

嚴我在Android上工作,我得到一個不受支持的編碼異常。我在哪裏可以找到所有可能的編碼? – 2013-02-14 23:04:17

+1

您是否嘗試過「ISO-8859-1」? – 2013-02-14 23:16:33

+0

@BeppiMenozzi答案的作者,雖然你的文件包含字節253,因此他認爲它可能是一些模糊的IBM PC代碼頁。現在我們知道它是209,因此''「ISO-8859-1」'是正確的參數(我希望它在任何地方都能得到支持)。 – 2013-02-14 23:19:43