2012-06-07 4 views
4

while 루프에서 UTF-8 문자열을 사용하는 int 배열을 StringBuilder로 변환하는 방법은 무엇입니까? 예 :
INT 배열 : 71, 73, 70, 56, 57, 97, 149, 0, 55, 0, 247 ...
결과 스트링 : GIF89a • € ÷ € € €€ ÀÜÀ|Êð * ? ª *? ÿ ... 라인이 방법은 모든 비 - 라틴 문자를 분해 라틴어, 키릴 문자와 아시아 문자, 다양한 기호와 숫자Java int 배열 to StringBuilder

do buffer.append((char)num[++i]); 
while((byte)buffer.charAt(buffer.length()-1) != -1); 

을 포함
.

+0

당신이 할 수 전체 버퍼에 대한 데이터를 표시 하시겠습니까? – dasblinkenlight

+0

+1 질문에 _weird_ 기호를 얻기위한 .. :) – Asif

답변

3

먼저 바이트 []에 INT [] 변환 :

//intArray contains your data... 
    byte[] utf8bytes = new byte[intArray.length]; 
    for(int i = 0; i < intArray.length; i++) 
    { 
     utf8bytes[i] = (byte) intArray[i]; 
    } 

그런 다음 인코딩으로 UTF-8로 지정하여 바이트에서 문자열을 만들 :

String asString = new String(utf8bytes, "UTF-8"); 
+0

int는 4 대신 1 바이트를 포함합니까? – Dmitriy

+0

int 값의 배열 <256을 다루는 것처럼 보인 예제 값의 (아주 작은) 선택에서 바이트로 쉽게 형변환 할 수 있습니다. int에 4 바이트를 넣은 경우에는 대부분 절대 값이 매우 큽니다. 당신은 비트 마스크와 논리적 인 쉬프트를 사용하여 그것들을 별도의 바이트로 언팩 할 수 있습니다 ... –

+0

utf8bytes [0] = (byte) (intArray [i] >>> 24); utf8bytes [1] = (byte) (intArray [i] >>> 16); utf8bytes [2] = (byte) (intArray [i] >>> 8); utf8bytes [3] = (byte) intArray [i]; 각 라틴 문자 뒤에는 3 개의 공백 문자가 추가됩니다. 각 키릴 문자 뒤에는 2 개의 공백 문자가 추가됩니다. – Dmitriy

0

You are reading in a GIF89a file 바이트 당 하나의 정수로 표시 한 다음 텍스트 문자열 인 것처럼 인쇄합니다. 가장 큰 문제는 해당 파일 내의 정수 (바이트)가 의미있는 텍스트 문자에 실제로 매핑되지 않기 때문에 매핑이 알파벳 부분을 렌더링하지 못하는 경우 텍스트 인코딩이 지시하는 모든 내용이 렌더링된다는 것입니다. 쓰레기의).

그래픽 정보가 항상 텍스트에 명확하게 매핑되는 것은 아닙니다. 256 개의 가능한 바이트 값이 있고, 때로는 하나 이상의 바이트가 하나의 문자를 나타내는 반면, 영어 알파벳에는 대문자와 소문자로만 표시된 26 개의 문자가 있습니다. 10 자리 숫자와 소수의 구두점과 함께 약 80 개의 다른 글자가 공통으로 사용됩니다. 나머지 160 개 이상의 문자는 제어 코드, 멀티 바이트를 사용하는 신호 또는 외국어 표시를 지원하는 문자에 대한 매핑입니다.

가비지는 현재 문자 세트에 유효한 바이트 대 문자 매핑에 가장 가까운 것입니다. 더 나은 출력을 원한다면 관련 문자에 매핑되는 데이터가 포함 된 파일을 읽으십시오. 다음과 같이 모든

+1

아니, 이것은 단지 예일 뿐이며 프로그램은 파일을 읽도록 설계되지 않았습니다. 이 프로그램은 러시아어 및 아시아권 언어의 문자 메시지로 작동합니다. – Dmitriy