MVPArms icon indicating copy to clipboard operation
MVPArms copied to clipboard

gzip解码中文字符出现乱码

Open azhu003 opened this issue 5 years ago • 2 comments

Environment

  • [x] MVPArms Version: 2.5.2
  • [x] AndroidStudio Version: 3.5.3

Bug Description:

ZipHelper#decompressForGzip while ((bytesRead = gis.read(data)) != -1) { string.append(new String(data, 0, bytesRead, charsetName)); } 拼接中文时会乱码

Related Code:

  if (compressed.length == 0) {
            return null;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ByteArrayInputStream in = new ByteArrayInputStream(compressed);
        try {
            GZIPInputStream ungzip = new GZIPInputStream(in);
            byte[] buffer = new byte[256];
            int n;
            while ((n = ungzip.read(buffer)) >= 0) {
                out.write(buffer, 0, n);
            }
            closeQuietly(ungzip);
            return out.toString(charsetName);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            closeQuietly(in);
            closeQuietly(out);
        }
        return null;

替换为以下代码可修复

if (compressed.length == 0) {
            return null;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ByteArrayInputStream in = new ByteArrayInputStream(compressed);
        try {
            GZIPInputStream ungzip = new GZIPInputStream(in);
            byte[] buffer = new byte[256];
            int n;
            while ((n = ungzip.read(buffer)) >= 0) {
                out.write(buffer, 0, n);
            }
            closeQuietly(ungzip);
            return out.toString(charsetName);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            closeQuietly(in);
            closeQuietly(out);
        }
        return null;

Others:

image

azhu003 avatar Feb 04 '20 06:02 azhu003

兄弟你贴出来的的两段代码是一样的啊。。。

JessYanCoding avatar Feb 27 '20 11:02 JessYanCoding

抱歉,源代码是这段

        final int BUFFER_SIZE = compressed.length;
        GZIPInputStream gis = null;
        ByteArrayInputStream is = null;
        try {
            is = new ByteArrayInputStream(compressed);
            gis = new GZIPInputStream(is, BUFFER_SIZE);
            StringBuilder string = new StringBuilder();
            byte[] data = new byte[BUFFER_SIZE];
            int bytesRead;
            while ((bytesRead = gis.read(data)) != -1) {
                string.append(new String(data, 0, bytesRead, charsetName));
            }
            return string.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            closeQuietly(gis);
            closeQuietly(is);
        }
        return null;

azhu003 avatar Feb 28 '20 03:02 azhu003