在上一节中说明了每次读取一个字节时乱码解决方法,这一节我将阐述每次读取多个字节乱码的解决。
问题:
中文字符占2个字节,非中文占一个字节
例如:"abc中国"
当我们以每四个字节读取文件时,此时会读到 "abc" + "中"的一半,此时就会产生乱码。
byte[] b = new btye[4];
inputStream.read(b);//出现乱码
解决方法:
1.判断当前读到的 byte数组是否乱码,参考: http://www.cnblogs.com/Nbge/archive/2013/05/22/3093041.html
2.当前byte数组存在乱码时,必定是在读取最后一个字节时读到了中文的一半,此时我们再读取一个字节,然后重新创建byte数组,这样就解决了乱码。
源码:
public void test() {
byte[] b = new byte[4];
int len = -1;
try (InputStream is = new FileInputStream("files/test2.txt")) {
while ((len = is.read(b)) != -1) {
// String s = new String(new byte[] { b[len - 2], b[len - 1] });
String s = new String(b, 0, len);
byte[] b2 = s.getBytes("iso8859_1");
// 以 iso8859_1 编码时出现乱码时 byte 值为 63
if (b2[b2.length - 1] == 63) {
byte[] b3 = new byte[1];
is.read(b3);
byte temp = b3[0];
b3 = Arrays.copyOf(b, b3.length + b.length);
b3[b3.length - 1] = temp;
System.out.print(new String(b3, 0, b3.length));
} else {
System.out.print(new String(b, 0, len));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
在处理字节流读取文件时,如果以固定字节数读取,可能会遇到中文乱码问题。当读取中文字符跨越字节边界时,会出现乱码。解决方案包括检测读取的字节数组是否乱码,如果发现乱码,则读取额外的一个字节并重新组合字节数组以避免乱码。
&spm=1001.2101.3001.5002&articleId=52042886&d=1&t=3&u=62060c1321714fb8b566990bdcccb26e)
591

被折叠的 条评论
为什么被折叠?



