2012-10-16 2 views
1
에 [] 바이트

나는 다음은 거짓입니다 같은 자바 문자열로 실행 한 :는 문자열

body.equals(new String(body.getBytes())); 

내가 문자열 생성자의 인코딩 치료를 기본으로하기 때문에 이것이 가정 본문 바이트 [] UTF-8로, 나는 100 % 확실하지 않다. 이 문자열을 byte []로 저장하고 나중에 다시 변환 할 수 있습니까? 바이트 인코딩이 무엇인지 결정할 수 있어야한다고 생각합니다. 어떻게해야합니까?

일부 컨텍스트 : 데이터를 압축하고 db에 저장 한 다음 나중에 압축을 풀고 압축되지 않은 바이트 []를 원래 문자열로 되돌릴 수 있도록 바이트 []가 필요합니다. 문자열은 원래 웹 페이지를 다운로드 한 라이브러리에서 가져온 것이므로 문자열을 처리하기 전에 처리 방법을 잘 모르겠습니다.

+0

[문자 인코딩이란 무엇이며 왜 신경 써야합니까?] (http://stackoverflow.com/questions/10611455/what-is-character-encoding-and-why-should-i-bother- with-it) – Raedwald

답변

1

문자열 배열에서 문자열을 만들 때 문자열 에서 바이트 배열을 만들 때 두 가지 방법으로 동일한 문자 세트를 사용해야합니다.

body.equals(new String(body.getBytes("utf-8"), "utf-8")); 

이 상관없이 환경, 바이트를 알 수있는 것을 보장 할 것

그래서 당신은 예로서 더 좋을 것이다.

또한 거의 의심의 여지없이 유니 코드를 사용해야합니다. 싱글 바이트 인코딩 (예 : ISO 코드 페이지)을 선택하면 현재 요구 사항을 충족시키는 싱글 바이트 인코딩이 있어도 나중에 후회할 수 있습니다.

+0

생성자에 대한 문서와'getBytes'는 VM이 ​​시작되고 기본 charset이 캐시 된 후에는 변경되지 않는 기본 charset을 사용할 것이라고 양쪽 모두가 이미 알고 있기 때문에 이미 그렇습니다. – Dunes

+0

@Dunes, true, 실제 코드 예제가 실제 응용 프로그램의 어느 곳에도 나타나지 않는다고 가정했지만 올바른 사용 방법과 올바른 getBytes 메서드를 모두 보여주는 간단한 줄입니다. 실제로이 두 건의 통화는 시간과 영구 저장소로가는 왕복으로 구분됩니다. 이 경우 두 호출 모두에서 charset을 제공하고 플랫폼 기본값에 의존하지 않는 것이 훨씬 안전합니다 (모든 환경/플랫폼에서). 생산에서이 정확한 라인을 진정으로 사용했다면 결코 그렇게 할 필요가 없지만 절대적으로 옳습니다. – joelittlejohn

1

인코딩을 지정하지 않고 바이트와 문자간에 변환 할 때 동작은 플랫폼에 따라 다릅니다. JVM 전체의 기본 인코딩이 사용되며 시스템에 따라 다릅니다. 인코딩이 ASCII이고 ASCII가 아닌 문자가 있으면 어떻게 될지 정확히 알지 못하지만 다른 문자열을 얻을 것입니다. 이것을 피하기 위해 콘서트 할 때마다 인코딩을 지정해야합니다.

2

플랫폼 기본 charset은 인코딩 및 디코딩에 사용됩니다.

문제는 charset이 제한 될 수 있다는 것입니다. US-ASCII. 캐릭터 라인 내의 char가 그 캐릭터 세트의 외측에있는 경우, 그것을 잃어 버립니다.

모든 유니 코드 문자를 포함하는 charset을 사용하십시오. UTF-8, UTF-16