我有一个用拉丁文,西里尔文和中文字符包含的文本。我尝试用GZIPOutputStream压缩一个字符串(在bytes[]上),然后用GZIPInputStream解压缩。但我不能设法将所有字符转换回原始字符。有些显示为?。
我认为UTF-16可以完成这项工作。
有什么帮助吗?
问候
下面是我的代码:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import java.util.zip.Inflater;
import java.util.zip.ZipException;
public class CompressUncompressStrings {
public static void main(String[] args) throws UnsupportedEncodingException {
String sTestString="äöüäöü 长安";
System.out.println(sTestString);
byte bcompressed[]=compress(sTestString.getBytes("UTF-16"));
//byte bcompressed[]=compress(sTestString.getBytes());
String sDecompressed=decompress(bcompressed);
System.out.println(sDecompressed);
}
public static byte[] compress(byte[] content){
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try{
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
gzipOutputStream.write(content);
gzipOutputStream.close();
} catch(IOException e){
throw new RuntimeException(e);
}
return byteArrayOutputStream.toByteArray();
}
public static String decompress(byte[] contentBytes){
String sReturn="";
ByteArrayOutputStream out = new ByteArrayOutputStream();
try{
GZIPInputStream gzipInputStream =new GZIPInputStream(new ByteArrayInputStream(contentBytes));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for (int value = 0; value != -1;) {
value = gzipInputStream.read();
if (value != -1) {
baos.write(value);
}
}
gzipInputStream.close();
baos.close();
sReturn=new String(baos.toByteArray(), "UTF-16");
return sReturn;
// Ende Neu
} catch(IOException e){
throw new RuntimeException(e);
}
}
}发布于 2011-08-15 22:32:01
我怀疑这只是控制台有问题。我尝试了上面的代码,尽管它没有正确打印出任何字符,但当我测试字符串的往返时,它是正常的:
System.out.println(sDecompressed.equals(sTestString)); // Prints true这在你的机器上做什么?
发布于 2011-08-15 22:38:40
在控制台输出上显示非ASCII字符并非易事。假设您使用Windows作为操作系统(因为命令行在缺省情况下不支持Unicode ),您可以更改活动代码页码(使用chcp命令)。我不知道它是如何通过代码完成的,但我建议在命令行上运行代码。
这个chcp值65001更改为告诉windows在其控制台上使用UTF-8 (您可以查看讨论here)。
我希望这能帮到你。
https://stackoverflow.com/questions/7066077
复制相似问题