GZIPInputStream и Набор символов - PullRequest
4 голосов
/ 15 августа 2011

У меня есть текст, содержащий латинские, кириллические и китайские иероглифы.Я пытаюсь сжать строку (более bytes[]) с GZIPOutputStream и распаковать ее с помощью 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);
        }
    }
}

Ответы [ 2 ]

1 голос
/ 15 августа 2011

Отображение не ASCII-символа на консольном выводе не так просто.Предполагая, что вы используете Windows в качестве операционной системы (поскольку командная строка по умолчанию не поддерживает Unicode), вы можете изменить номер активной кодовой страницы (используя команду chcp).Я не знаю, как это делается с помощью кода, но я предлагаю запустить код в командной строке.

Это значение chcp 65001 изменяется, чтобы указывать окнам использовать UTF-8 на своей консоли (вы можете просмотреть обсуждение здесь ).

Надеюсь, это поможет.

1 голос
/ 15 августа 2011

Я подозреваю, что проблема связана только с консолью. Я попробовал приведенный выше код, и хотя он не распечатал ни один из символов должным образом, при тестировании циклического повторения строки это было нормально:

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

Что это делает на вашей машине?

...