[Java] 자바 아스키코드및 유니코드로 문자 변환

    아스키코드(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
    가
    가
    張
    張
    

     

    댓글

    Designed by JB FACTORY