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(); 
相关问题