5

ラテン文字、キリル文字、漢字を含むテキストがあります。私は文字列を(以上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);
        }
    }
}
4

2 に答える 2

1

問題が発生しているのはコンソールだけだと思います。上記のコードを試しましたが、どの文字も正しく印刷されませんでしたが、文字列のラウンドトリップをテストしたところ、問題はありませんでした。

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

それはあなたのマシンで何をしますか?

于 2011-08-15T14:32:01.283 に答える
1

コンソール出力に非 ASCII 文字を表示するのは簡単ではありません。オペレーティング システムとして Windows を使用していると仮定すると (コマンド ラインは既定で Unicode をサポートしていないため)、アクティブなコード ページ番号を (chcpコマンドを使用して) 変更できます。コードでどのように行うかはわかりませんが、コマンドラインでコードを実行することをお勧めします。

この chcp 値65001は、ウィンドウのコンソールで UTF-8 を使用するように変更されます (ここで議論を表示できます)。

これが役立つことを願っています。

于 2011-08-15T14:38:39.910 に答える