2011-08-15 10 views
4

私は、ラテン語、キリル文字、および中国語の文字を含むテキストを持っています。 GZIPOutputStreamでString(bytes[]以上)を圧縮し、GZIPInputStreamで圧縮解除しようとしました。しかし、私はすべてのキャラクターを元のキャラクターに戻すことはできません。一部は?と表示されます。GZIPInputStreamとCharacterset

私は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); 
     } 
    } 
} 
+0

「System.out.println(sTestString);」とは何ですか?ジャンクを表示する場合は、stdoutエンコーディングに問題があります。使用する環境(Windowsコマンドプロンプト、Eclipse IDEなど)を教えて、適切に設定する方法を教えてください。 – BalusC

答えて

1

よろしく

ここに私のコードです。私は上記のコードを試みたが、それが適切に任意の文字を印刷しませんでしたが、私は、文字列のラウンドトリップを試験したとき、それは大丈夫だった:

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

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

+0

あなたのお返事ありがとうございます。 – mcflysoft

1

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

このchcp値65001は、コンソール上でUTF-8を使用するように通知するように変更されました(ディスカッションhereを表示できます)。

こちらがお役に立てば幸いです。

+0

これらの文字をサポートするコマンドコンソールフォントが必要です。 – BalusC

+0

@BalusC、ご使用のOSがコードページ65001をサポートしていない場合はtrueです。簡単なことではありません。 :) –

+0

Windowsは間違いなくそれをサポートしています。それは、すべてのUnicode文字を表示できるコマンドコンソールフォントがないことです。あなたが得ることができるものがLucidaコンソールユニコードです。しかし、それは例えば中国の字形を持たない。 – BalusC

関連する問題