2011-08-15 1 views
4

라틴어, 키릴 문자 및 중국어 문자가 포함 된 텍스트가 있습니다. GZIPOutputStream으로 문자열 (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 문자를 표시하는 것은 쉽지 않습니다. 명령 줄에서 기본적으로 유니 코드를 지원하지 않으므로 Windows를 운영 체제로 사용한다고 가정하면 활성 코드 페이지 번호를 변경할 수 있습니다 (chcp 명령 사용). 코드를 통해 어떻게 이루어 졌는지는 모르지만 명령 줄에서 코드를 실행하는 것이 좋습니다.

이 chcp 값 65001은 콘솔에서 UTF-8을 사용하도록 알림 창을 변경합니다 (사용자가 here 토론을 볼 수 있음).

이 정보가 도움이되기를 바랍니다.

+0

그런 다음 해당 문자를 지원하는 명령 콘솔 글꼴이 필요합니다. – BalusC

+0

@BalusC, 귀하의 OS가 코드 페이지 65001을 지원하지 않는다면 사실입니다. 쉬운 일이라고 말하지는 않았습니다. :) –

+0

Windows가 확실히 지원합니다. 모든 유니 코드 문자를 표시 할 수있는 명령 콘솔 글꼴이 부족합니다. 가장 좋은 것은 Lucida Console Unicode입니다. 그러나 예를 들어 중국어 글립 문자는 없습니다. – BalusC

관련 문제