2009-07-01 67 views
7

我有一個FTP客戶端類,它返回指向文件的InputStream。我想用BufferedReader逐行讀取文件。問題是,客戶端以二進制模式返回文件,並且該文件具有ISO-8859-15編碼。BufferedReader返回ISO-8859-15字符串 - 如何轉換爲UTF16字符串?

+0

我看不出UTF-8在這裏如何介入 - Java在內部使用UTF-16,而不是UTF-8。 – 2009-07-01 16:01:53

+0

對不起,應該說UTF-16。固定。 – tputkonen 2009-07-02 00:05:59

回答

21

如果文件/流/無論真正包含ISO-8859-15編碼文本,您只需指定創建InputStreamReader時:

BufferedReader br = new BufferedReader(
    new InputStreamReader(ftp.getInputStream(), "ISO-8859-15")); 

Then readLine()將在Java的本地編碼(UTF-16,而不是UTF-8)中創建有效的字符串。

1

原始字符串在ISO-8859-15中,所以由您的InputStreamReader讀取的字節流將採用此編碼。所以請閱讀使用該編碼(在InputStreamReader構造函數中指定)。這告訴InputStreamReader傳入的字節流在ISO-8859-15中並執行適當的字節到字符轉換。

現在它將採用標準的Java UTF-16格式,然後您可以按照自己的意願進行操作。

我認爲目前的問題是,您正在使用您的默認編碼(通過在InputStreamReader中未指定編碼)讀取它,然後嘗試轉換它,屆時它爲時已晚。

對這些類使用默認行爲往往以悲傷告終。這是哪裏,你可以指定編碼,和/或通過默認情況下,VM編碼是個好主意-Dfile.encoding

+0

Downvoted爲什麼? – 2013-02-08 16:00:11

+0

一定是一個錯位,對不起,它爲時已晚,以致無法撤消:( – Kieran 2013-02-11 08:38:49

0

你試過:

BufferedReader r = new BufferedReader(new InputStreamReader("ISO-8859-1")) 
... 
9

試試這個:

BufferedReader br = new BufferedReader(
         new InputStreamReader(
          ftp.getInputStream(), 
          Charset.forName("ISO-8859-15") 
         ) 
        ); 
String row = br.readLine(); 
相關問題