2012-02-15 137 views
0

我有以下我們用它來壓縮字符串(含誤差和資源爲清楚起見處理移除)代碼:GZIP串壓縮不解壓「£」字符

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) 

誰能告訴我,我的方式錯誤,我怎麼可能會解決這種情況呢?有沒有更好的方法來做到這一點?提前謝謝了。

回答

5

當你壓縮數據,則應指定字符編碼:

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

如果你不這樣做,文本根據系統默認的編碼,而你的情況不轉換爲UTF-字節8。

+2

棒極了!完美的作品。感謝您指出我的(現在相當明顯的)錯誤。 – 2012-02-15 08:07:07