Java BufferedReader中的解码错误

Java BufferedReader中的解码错误,java,decode,Java,Decode,我从服务器收到一些数据,并从java代码中读取它们: is = new BufferedInputStream(connection.getInputStream()); reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); int length; char[] buffer = new char[4096]; StringBuilder sb = new StringBuilder(); while ((length

我从服务器收到一些数据,并从java代码中读取它们:

is = new BufferedInputStream(connection.getInputStream());
reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));

int length;
char[] buffer = new char[4096];
StringBuilder sb = new StringBuilder();
while ((length = reader.read(buffer)) != -1) {
   sb.append(new String(buffer, 0, length));//buffer is already incorrect
}

byte[] byteDatas = sb.toString().getBytes();
我将字节数据打印为十六进制字符串:

与wireshark的结果相比:

有些字节被解码为bf bd ef,我知道它的\ufffd(65533)代表无效数据

所以我认为我的代码中一定有解码错误,调试后,我发现如果我使用connection.getInputStream()直接读取数据,就不会有无效数据

因此,问题一定发生在
BufferedReader
InputStreamReader
中,但我已经添加了“UTF-8”,wireshark中的数据似乎不是很有线。UTF-8是否不正确?服务器不回复字符集

请帮助如何让BufferedReader读取正确的数据

更新

我的默认字符集是“UTF-8”,需要调试来证明。在
读取
返回后,我已经得到了错误的数据,因此这不是字符串的错误。

将使用平台的默认编码(不一定是UTF-8)将
字符串的字符转换为字节

String.getBytes()
的javadoc中引用:

使用平台的默认字符集将此字符串编码为字节序列

无法将UTF-8编码的输入数据与可能不是UTF-8编码结果的结果进行比较。而是像下面这样显式指定编码:

byte[] byteDatas = sb.toString().getBytes(StandardCharsets.UTF_8);
注意:


如果输入数据不是UTF-8编码的文本,并且尝试将其解码为UTF-8,则解码器可能会替换无效的字节序列。这将导致通过编码
字符串
得到的字节与输入的原始字节不同。

在读取文本输入时需要指定字符集……这是一个这样或那样的问题。我认为您读取的不是字符流,而是字节内容,因此数据存在问题。@BuhakeSindi字节内容,我认为这种方式也可以读取字节内容。@zzy不是真的。读这篇文章以更好地理解我的意思。而是直接读取
字节
并对其进行十六进制编码,而不是使用字符数组。@BuhakeSindi我知道了,现在我不知道服务器是否会回复
字符
字节
),我是否应该总是读取字节而不是字符,以便正确读取数据,并让upper决定是否转换为
字符
?当我从
读取
时,缓冲区已经错误。这不是字符串的错误。那么很可能您的输入不是UTF-8编码的文本,如果您尝试将其解码为UTF-8,解码器可能会替换无效的字节序列。