Java/문자열

[Java]바이트 배열을 문자열로 변환(Byte Array to String)

DevStory 2022. 8. 18.

바이트 배열을 문자열로 변환

바이트 배열을 문자열로 변환하는 방법을 설명하기 전에 인코딩과 디코딩 개념을 이해할 필요가 있습니다.

 

컴퓨터는 이진수(0과 1) 데이터를 해석합니다.

 

문자, 기호, 숫자, 사진, 파일 등 다양한 데이터를 컴퓨터가 이해할 수 있도록 부호화하는 것을 인코딩(Encoding)이라고 말하며, 반대로 부호화된 데이터를 문자, 기호, 숫자, 사진, 파일로 변환하는 것을 디코딩(Decoding)이라고 말합니다.

 

문자를 인코딩 또는 디코딩하는 과정에서 Charset이라는 개념이 등장하는데, Charset은 문자를 어떠한 형식으로 변환할 것인지 전 세계적으로 표준화된 형식입니다.

 

부호화된 데이터를 문자로 디코딩하는 과정에서 인코딩에서 사용된 Charset과 디코딩에서 사용된 Charset이 다른 경우 원하지 않은 문자가 표시될 수 있으므로 Charset을 올바르게 설정했는지 확인할 필요가 있습니다.

 

다음은 Java에서 지원하는 Charset입니다.

- StandardCharsets.ISO_8859_1

- StandardCharsets.US_ASCII

- StandardCharsets.UTF_8

- StandardCharsets.UTF_16

- StandardCharsets.UTF_16BE

- StandardCharsets.UTF_16LE

 

이제 바이트 배열을 문자열로 변환하는 방법을 설명합니다.


기본 Charset 확인하는 방법

인코딩 또는 디코딩할 때, Charset을 명시하지 않으면 기본 Charset으로 설정됩니다.

 

기본 Charset을 확인하기 위해 다음 세 가지 방법을 사용할 수 있습니다.

- file.encoding

- java.nio.Charset의 Charset.defaultCharset()

- InpututStreamReader.getEncoding()

 

다음 예제는 위에서 소개한 세 가지 방법을 사용하여 기본 Charset을 콘솔에 출력합니다.

public static void main(String args[]) {
  // InputStreamReader 클래스의 getEncoding() 메서드를 호출하기 위한 과정
  InputStream instream = new ByteArrayInputStream("ABC".getBytes());
  InputStreamReader streamreader = new InputStreamReader(instream);
  String defaultCharset = streamreader.getEncoding();

  System.out.println("방법 1. file.encoding");
  System.out.println(System.getProperty("file.encoding"));

  System.out.println("\n방법 2. Charset.defaultCharset()");
  System.out.println(Charset.defaultCharset());

  System.out.println("\n방법 3. InputStreamReader.getEncoding()");
  System.out.println(defaultCharset);
}

[실행 결과]

방법 1. file.encoding
UTF-8

방법 2. Charset.defaultCharset()
UTF-8

방법 3. InputStreamReader.getEncoding()
UTF8

방법 1. String 생성자

다음 예제는 문자열에서 getBytes() 메서드를 호출하여 byte 배열로 변환합니다.

 

변환된 byte 배열을 String 생성자 함수에 전달하여 문자열로 변환합니다.

public static void main(String args[]) {
  byte[] byteArray = "Hello, 안녕!".getBytes();
  String strValue = new String(byteArray);

  System.out.println(Arrays.toString(byteArray));
  System.out.println(strValue);
}

[실행 결과]

[72, 101, 108, 108, 111, 44, 32, -20, -107, -120, -21, -123, -107, 33]
Hello, 안녕!

위 소스 코드는 Charset을 설정하지 않았으므로 문자열을 UTF-8 형식으로 인코딩합니다.


방법 2. Charset 설정

다음 예제는 문자열 "Hello, 안녕!"를 UTF-8 형식으로 인코딩하고 디코딩은 기본 UTF-16 형식으로 설정합니다.

public static void main(String args[]) {
  byte[] byteArray = "Hello, 안녕!".getBytes(StandardCharsets.UTF_8);
  String strValue = new String(byteArray, StandardCharsets.UTF_16);

  System.out.println(Arrays.toString(byteArray));
  System.out.println(strValue);
}

[실행 결과]

[72, 101, 108, 108, 111, 44, 32, -20, -107, -120, -21, -123, -107, 33]
䡥汬漬⃬閈锡

인코딩에서 사용된 Charset과 디코딩에서 사용된 Charset이 다르므로 문자가 깨지는 현상이 발생합니다.

 

다음 예제는 인코딩, 디코딩 형식을 UTF-16 형식으로 동일하게 설정합니다.

public static void main(String args[]) {
  byte[] byteArray = "Hello, 안녕!".getBytes(StandardCharsets.UTF_16);
  String strValue = new String(byteArray, StandardCharsets.UTF_16);

  System.out.println(Arrays.toString(byteArray));
  System.out.println(strValue);
}

[실행 결과]

[-2, -1, 0, 72, 0, 101, 0, 108, 0, 108, 0, 111, 0, 44, 0, 32, -59, 72, -79, 85, 0, 33]
Hello, 안녕!
반응형

댓글