首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GZIPInputStream和字符集

GZIPInputStream和字符集
EN

Stack Overflow用户
提问于 2011-08-15 22:25:05
回答 2查看 2.2K关注 0票数 5

我有一个用拉丁文,西里尔文和中文字符包含的文本。我尝试用GZIPOutputStream压缩一个字符串(在bytes[]上),然后用GZIPInputStream解压缩。但我不能设法将所有字符转换回原始字符。有些显示为?

我认为UTF-16可以完成这项工作。

有什么帮助吗?

问候

下面是我的代码:

代码语言:javascript
复制
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);
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2011-08-15 22:32:01

我怀疑这只是控制台有问题。我尝试了上面的代码,尽管它没有正确打印出任何字符,但当我测试字符串的往返时,它是正常的:

代码语言:javascript
复制
System.out.println(sDecompressed.equals(sTestString)); // Prints true

这在你的机器上做什么?

票数 1
EN

Stack Overflow用户

发布于 2011-08-15 22:38:40

在控制台输出上显示非ASCII字符并非易事。假设您使用Windows作为操作系统(因为命令行在缺省情况下不支持Unicode ),您可以更改活动代码页码(使用chcp命令)。我不知道它是如何通过代码完成的,但我建议在命令行上运行代码。

这个chcp值65001更改为告诉windows在其控制台上使用UTF-8 (您可以查看讨论here)。

我希望这能帮到你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7066077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档