[Java] 자바 아스키코드및 유니코드로 문자 변환
- 인공지능 및 데이터과학/자연어처리
- 2021. 1. 12.
아스키코드(ASCII)
아스키코드(American Standard Code for Information Interchange, ASCII)는 아스키의 말을 풀어 썼을 때 알 수 있는 것처럼 오로지 미국을 위한 표준 부호였다. 초창기 컴퓨터는 영어권에서 사용됐으며, 당시 그들은 전세계의 말을 쓸 필요가 없다 생각했기에 1bit의 체크섬(Checksum)용을 제외하고 라틴 문자, 숫자 그리고 특수 문자들을 128개 모와 7bit의 아스키코드를 만들었다.
그러나, 컴퓨터의 발달로 전세계가 각자 부호표를 만들어 수많은 캐릭터셋(ex: euckr, cp949)을 만들게 되었고 이 캐릭터셋은 최근 10년 들어서 UTF-8로 대동단결하게 된다. 참고로 10년전만 하더라도 수많은 국내 사이트들이 EUC-KR로 사이트를 운영했었고, UTF-8로 가면서 많은 일들이 벌어졌었는데 바이트수가 커졌기 때문에 검색엔진 및 DB들이 느려지거나 메모리가 부족하는 현상들이 빈번하게 발생하였던 적이 있었다.
유니코드(Unicode)
유니코드라는 것은 즉 전세계의 코드표를 모두 모와 한번에 제공하자라는 개념이며, 흔히 UTF-8을 유니코드와 동일선상으로 이해하지만 UTF-8은 유니코드의 한 방법이며, 워낙 대중적이기 때문에 이렇게 이해하더라도 큰 문제는 없다. 초창기 rest의 개념을 json으로 리턴하는 것으로 이해하는 사례가 많은 것과 비슷한 맥락이라 할 수 있다.
유니코드는 기본적으로 16비트(bit) 즉, 2바이트(Byte)로 단어들을 표현하였다. 1Byte는 256bit이기에, 즉 2Byte는 256 x 256 = 65,536 글자를 표현할 수 있다.
UTF-8
유니코드의 대표적인 문자 인코딩으로 UTF-8(Universal Coded Character Set + Transformation Format 8-bit)이 있기 때문에 UTF-8에 대해서 설명을 하자면, 한 문자를 표현하기 위해서 1바이트에서 4바이트까지를 사용한다. 예를 들어 아스키코드에 포함된 문자들은 1바이트만으로 표시된다.
유니코드는 기본적으로 U+라는 표식을 붙이며 나머지 16진수의 숫자값을 4개 더해서 표식을 한다. 16진수를 2번 곱하면 256이 되기에 1Byte가 되며, 16진수 숫자가 4개면 2Byte가 되기에 실질적으로 U+2Byte 16진수로 인식을 하면 되나 최근 들어서 문자가 계속 증가하였기 65536 범위가 넘어셨으면 이를 위해 평면이라는 개념이 추가 생겨났다.
우리가 일반적으로 아는 유니코드는 다국어 기본 평면(BMP)이며 추가로 늘어난 평면들은 U+와 2바이트 조합에 숫자들이 추가된 것을 볼 수 있다. 즉 다국어 기본 평면이 아니면 유니코드는 4바이트까지 확장이 된다
자바로 아스키 코드 및 유니코드 변환
public class Main {
public static void main(String[] args) {
String text = "A가나張";
for(int i = 0; i < text.length(); i++) {
System.out.println("=========================================================");
System.out.println(text.charAt(i));
// 10진수
System.out.println((int)text.charAt(i)); // 아스키코드 및 유니코드
// 16진수
System.out.format("0x%02X%n", (int)text.charAt(i)); // 아스키코드 ex) A -> 0x41
System.out.format("0x%04X%n", (int)text.charAt(i)); // 유니코드 ex) 가 -> 0xAC00
}
System.out.println("=========================================================");
// 문자로 변환
System.out.println((char)65); // 10진수 A 65 -> A
System.out.println((char)0x41); // 16진수 A -> A
System.out.println((char)44032); // 유니코드(10진수) 가 44032 -> 가
System.out.println((char)0xAC00); // 유니코드 가 0xAC00 -> 가
System.out.println((char)24373); // 유니코드 張 44032 -> 가
System.out.println((char)0x5F35); // 유니코드 張 44032 -> 가
}
}
결과
=========================================================
A
65
0x41
0x0041
=========================================================
가
44032
0xAC00
0xAC00
=========================================================
나
45208
0xB098
0xB098
=========================================================
張
24373
0x5F35
0x5F35
=========================================================
A
A
가
가
張
張
'인공지능 및 데이터과학 > 자연어처리' 카테고리의 다른 글
형태소 분석기, Okt(Open Korean Text) (구)트위터 형태소분석기 (2) | 2021.01.16 |
---|---|
[Java] 자바로 한글 자모(초성,중성,종성) 분리(추출)하기 (+개념) (0) | 2021.01.12 |
형태소 분석의 개념과 konlpy로 사용 하기 (0) | 2021.01.10 |
[Python] 파이썬을 이용한 자모(초성/중성/종성) 분리 및 결합하기 (0) | 2020.12.22 |
[데이터수집] 포스팅 크롤링하기 #1 (전략편) (0) | 2019.11.20 |