Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BufferedReader返回ISO-8859-15字符串-如何转换为UTF16字符串?_Java_Character Encoding - Fatal编程技术网

Java BufferedReader返回ISO-8859-15字符串-如何转换为UTF16字符串?

Java BufferedReader返回ISO-8859-15字符串-如何转换为UTF16字符串?,java,character-encoding,Java,Character Encoding,我有一个FTP客户端类,它返回指向文件的InputStream。我想用BufferedReader逐行读取文件。问题是,客户端以二进制模式返回文件,并且文件采用ISO-8859-15编码。原始字符串采用ISO-8859-15,因此InputStreamReader读取的字节流将采用此编码。因此,使用该编码读入(在InputStreamReader构造函数中指定)。这将告诉InputStreamReader传入的字节流在ISO-8859-15中,并执行适当的字节到字符转换 现在它将是标准的Java

我有一个FTP客户端类,它返回指向文件的InputStream。我想用BufferedReader逐行读取文件。问题是,客户端以二进制模式返回文件,并且文件采用ISO-8859-15编码。

原始字符串采用ISO-8859-15,因此InputStreamReader读取的字节流将采用此编码。因此,使用该编码读入(在InputStreamReader构造函数中指定)。这将告诉InputStreamReader传入的字节流在ISO-8859-15中,并执行适当的字节到字符转换

现在它将是标准的JavaUTF-16格式,然后您可以做您想要做的事情

我认为当前的问题是,您正在使用默认编码读取它(通过在InputStreamReader中不指定编码),然后尝试转换它,到那时已经太晚了

对这类类类使用默认行为通常会以悲伤告终。最好尽可能指定编码,和/或通过
-Dfile默认VM编码。编码

您是否尝试过:

BufferedReader r = new BufferedReader(new InputStreamReader("ISO-8859-1"))
...
试试这个:

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

如果文件/stream/where确实包含ISO-8859-15编码文本,则在创建InputStreamReader时只需指定:

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

然后,
readLine()
将以Java的本机编码(即UTF-16,而不是UTF-8)创建有效字符串。

我不知道UTF-8是如何涉及到这里的-Java在内部使用UTF-16,而不是UTF-8。对不起,它应该说是UTF-16。Fixed.s/b ISO-8859-15,而不是ISO-8859-1I我很确定,除非您使用接受编码器参数的构造函数的形式,而不仅仅是字符串或字符集,否则在格式错误的输入上不会出现异常。@tchrist:您指的是接受CharsetDecoder参数的ISR构造函数,对吗?的确,所有其他的CTOR都会创建解码器来替换无效字符,而不是抛出异常。但我认为ISO-8859-15解码器无论如何都不会抛出异常。每个可能的字节值都映射到一个有效字符,这是它检测错误输入的唯一方法。是的,没错。问题是,当你要求UTF-8,但没有得到它-并没有得到一个例外!!类似地,对于输出,如果您(愚蠢地)默认为平台默认编码,则在Mac上,该编码至少用
字符替换不可映射的代码点,同样没有警告或异常。在这些方面,我已经习惯了使用Perl进行更安全的操作,Java默认值完全被破坏了。因此,我们的整个代码库(Java部分,而不是Perl部分)充满了令人讨厌的错误。几乎使您想要对stdjavalibs进行猴子补丁。几乎。☺一定是打错了,抱歉,现在取消太迟了:(