[Java] Java와 한글

Unicode Transformation Format

Java String은 UTF-16 BE(Big Endian)을 사용한다. 직렬화나 역직렬화시에는 변형된 UTF-8(Modefied UTF-8)을 사용한다. 변형된 UTF-8에서 U+0000을 2바이트로 표시하는 이유는 이종시스템간의 호환성 때문이다. 즉, null을 문자열의 끝으로 표기하는 C같은 언어에서 U+0000을 읽을 때 문자열의 끝으로 잘못 처리하는 일이 없기 위해서이다.

C 계열 개발자가 주의해야할 사항은 문자열을 C의 1바이트 char 배열로 여기는 경향이 있기 때문에 자바와의 차이점을 잘 이해해야 한다. Java String은 내부적으로 UTF-16 BE 인코딩을 통해 문자열을 처리하고 문자열을 입/출력시에만 사용자 지정 인코딩 값을 이용한다. JVM 기본 인코딩은 JVM 로딩시에만 초기화 되므로 코드 중간에서 file.encoding 프로퍼티를 바꾸는 것은 의미가 없다. file.encoding이 지정되었지 않았다면 OS 환경 변수의 값을 따른다. 다음은 유니코드 코드 포인트와 Byte array를 확인할 수 있는 코드이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class main {
public static void main(String[] args) throws UnsupportedEncodingException {
String string = "한글";
for (int i = 0; i < string.length(); i++) {
System.out.print(String.format("U+%04X ", string.codePointAt(i)));
}
System.out.println();
byte[] bytes = string.getBytes();
for (byte b : bytes) {
System.out.print(String.format("0x%02X ", b));
}
System.out.println();
}
}

참고

https://d2.naver.com/helloworld/76650

Author: Song Hayoung
Link: https://songhayoung.github.io/2020/08/13/Languages/Java/javaHangle/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.