Сжатие строки GZIP не может распаковать символы '£' - PullRequest
0 голосов
/ 15 февраля 2012

У меня есть следующий код, который мы используем для сжатия строк (для ясности удалена обработка ошибок и ресурсов):

import java.util.zip.GZIP*;
import java.io.*;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.io.IOUtils;
import com.Ostermiller.util.Base64;

//Code to compress the string
ByteArrayOutputStream output = new ByteArrayOutputStream(65536);
BufferedWriter writer = new BufferedWriter(
           new OutputStreamWriter(new GZIPOutputStream(output)));
writer.write(stringContents);
String compressedString =  new String(Base64.encode(output.toByteArray()));

...

//Code to decompress the string
byte[] compressedData = Base64.decode(compressedString.getBytes());
BufferedInputStream reader = new BufferedInputStream(
           new GZIPInputStream(new ByteArrayInputStream(compressedData)));
String uncompressedString = IOUtils.toString(reader, "UTF-8");

Мы сталкиваемся с ошибкой при попытке кодировать, а затем декодировать строки с помощью 'В них.В частности, строка сжимается нормально, но при попытке распаковать строку мы получаем следующую трассировку стека:

sun.io.MalformedInputException
at sun.io.ByteToCharUTF8.convert(ByteToCharUTF8.java(Compiled Code))
at sun.nio.cs.StreamDecoder$ConverterSD.convertInto(StreamDecoder.java:287)
at sun.nio.cs.StreamDecoder$ConverterSD.implRead(StreamDecoder.java:337)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:223)
at java.io.InputStreamReader.read(InputStreamReader.java:208)
at java.io.Reader.read(Reader.java:113)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1128)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1104)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1078)
at org.apache.commons.io.IOUtils.toString(IOUtils.java:382)

Может кто-нибудь сказать мне ошибку моих путей и как я мог бы исправить эту ситуацию?Есть ли лучший способ сделать это?Большое спасибо заранее.

1 Ответ

5 голосов
/ 15 февраля 2012

Вы должны указать кодировку символов при сжатии данных:

BufferedWriter writer = new BufferedWriter(
           new OutputStreamWriter(new GZIPOutputStream(output), "UTF-8"));

Если вы этого не сделаете, текст преобразуется в байты в соответствии с системной кодировкой символов по умолчанию, которая в вашем случае не является UTF-8.

...