GZIPInputStream和字符集

5

我有一个包含拉丁、西里尔和中文字符的文本。我试图使用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);
        }
    }
}

那个 System.out.println(sTestString); 输出了什么?如果它也显示了乱码,那么你肯定有一个标准输出编码的问题。你需要告诉我们你正在使用什么环境(Windows 命令提示符?Eclipse IDE?等等),这样我们才能告诉你如何正确配置它。 - BalusC
2个回答

1

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

System.out.println(sDecompressed.equals(sTestString)); // Prints true

在你的机器上,那是做什么用的?


1
在控制台输出中显示非 ASCII 字符并不容易。假设您使用的操作系统是 Windows(因为命令行默认不支持 Unicode),您可以更改活动代码页号码(使用 chcp 命令)。我不知道如何通过代码完成这个过程,但建议在命令行上运行代码。
此 chcp 值 65001 更改以告诉 Windows 在其控制台上使用 UTF-8(您可以在 此处 查看讨论)。
希望这有所帮助。

然后您仍需要一个支持这些字符的命令控制台字体。 - BalusC
@BalusC,如果你的操作系统不支持代码页65001,则为true。我并没有说这是一件容易的事情。 :) - Buhake Sindi
Windows肯定支持这个。只是缺乏一个能够显示所有Unicode字符的命令控制台字体。最好的选择是Lucida Console Unicode,但它并没有包含中文字形的支持。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接