Url 글자 하나당 몇 byte

우리가 방의 크기를 26평이라고 표현하듯,

컴퓨터에서 데이터 크기를 표현하는 단위가 존재한다.

이는 아래 표와 같다.

8 bits 1 BYTE
1024 bytes 1 KB
1024 KB 1 MB
1024 MB 1 GB
1024 GB 1 TB
1024 TB 1 PB

비트는 데이터를 나타내는 최소 단위이다.

컴퓨터는 모든 데이터를 0과 1의 조합으로 구성하여 저장한다. 이 0 또는 1이 하나의 비트가 된다.

1개의 비트는 0 또는 1의 두 가지 상태를 나타낼 수 있으므로, n개의 비트로는 2ⁿ가지의 상태를 나타낼 수 있다.

예로, 2비트로는 00, 01, 10, 11 4가지 상태를 나타낼 수 있다.

위에 나와있듯 8비트가 모이면 1바이트가 된다.

컴퓨터 메모리에서 1바이트 당 하나의 주소값이 할당된다.

1바이트에는 하나의 영문자, 숫자, 기호, 공백을 담을 수 있다.

컴퓨터는 원래 ABC abc 123 !@#$% 이런 영문과 숫자, 기호만을 표현하는데, 한글이나 한자 등의 문자는 바이트 2개나 그 이상의 개수로 늘려서 표현한다.

이러한 문자, 숫자, 기호를 컴퓨터가 이해할 수 있는 0과 1의 조합으로 나타내려면 일정한 규칙이 필요하다.

그것을 정의해놓은 것이 바로 아스키코드와 유니코드이다.

출처: ascii.cl

아스키코드는 1BYTE를 이용하여 데이터를 표현하는데,

에러를 탐지하는 패리티 비트를 제외하고 총 7자리를 사용하여 2^7개인 128개의 문자를 표현한다.

유니코드에서의 한글. 출처: Unicode.org

하지만 아스키코드는 다양한 언어를 컴퓨터 속 데이터로 표현하기엔 문제가 있었다. 이런 한계를 극복하기 위해, 거의 모든 언어를 표현할 수 있는 유니코드가 탄생한다. 유니코드는 2바이트+a를 사용하여 2^16+a 개수만큼 표현할 수 있다. U+ 라는 접두어가 붙어있으면 유니코드 라는 의미이다. 아스키코드의 0x41은 대문자 A이고, 이를 유니코드표에서 찾으면 U+0041이 된다. 

여기서 잠깐, 10진수, 2진수, 8진수, 16진수로 데이터를 표현하는 방법은?

10진수

2진수

8진수

16진수

0~9 사용 0, 1 사용 0~7 사용 0~9, a, b, c, d, e, f 사용
    앞에 0 붙여서 구분 앞에 0x 붙여서 구분
    2진수 3자리로 8진수 1자리 표현 2진수 4자리로 16진수 1자리 표현
2 0000 0010 02 0x2
8 0000 1000 010 0x8
10 0000 1010 012 0xa

컴퓨터에서 2진수를 사용하게 된 계기는 무엇일까? 컴퓨터의 논리회로가 전기 신호가 있는 상태를 1, 없는 상태를 0으로 인식하기 때문이다. 즉, 컴퓨터는 1(turn on), 0(turn off) 두가지 상태를 인식한다.

그렇다면, 8진수와 16진수를 사용하는 이유는? 2진수로만 데이터를 표현하면 너무 길어지기 때문이다. 위의 표에 적혀 있듯이 2진수 3자리는 8진수 1자리로 대체할 수 있고, 2진수 4자리는 16진수 1자리로 대체할 수 있다. 한가지 예로, 색상을 표현할 땐 16진수를 사용한다. rgb 컬러 코드(#ff00ff). #ff00ff을 2진수로 변환한다면.. 111111110000000011111111 ㅎㅎ

이제 아스키코드와 유니코드를 이해했으니, 마지막으로 인코딩 방식 중 가장 많이 사용하는 UTF-8을 알아보도록 하겠다.

프로그래밍 언어는 영어로 이루어져 있다.

영어는 1바이트의 언어이고, 한글은 2바이트의 언어이다.

한글을 그대로 입력하면, 브라우저에서 한글이 깨져서 보이는 것을 처리해야 한다.

이런 문제가 발생하지 않도록 인코딩을 설정해 두는 것이 좋다.

utf-8은 모든 언어를 처리할 수 있기에 euc-kr보다 utf-8선호된다.

UTF-8, UTF-16, UTF-32같은 인코딩 방식은 유니코드표의 코드들을 어떻게 표현하느냐에 따라 달려있다.

UTF-8은 가변바이트를 사용하기 때문에, 1바이트로 표현이 충분한 A같은 경우는 0x41로 표현

UTF-16은 16비트 즉, 2바이트로 표현하기 때문에, 0x0041로 표현

UTF-32은 32비트 즉, 4바이트로 표현하기 때문에 0x00000041로 표현한다.

UTF-8의 표현 방식이 효율적이기에, 세계적으로도 UTF-8표준으로 많이 쓰이는 추세이다.

참고

//norux.me/31

이곳은 개인 공부용 블로그입니다. 틀린 부분이 있다면, 지적 부탁드립니다. 감사합니다 :^)

 안녕하세요. 백준 chogahui05입니다. 'A'를 ascii로 표현한다면 1byte로 표현이 됩니다. 그런데, '가'와 같은 것들은 ascii로 표현하지 못합니다. java에서 문자 인코딩 시간에 이야기를 조금 했었습니다. utf-8 인코딩 형식에서는 3byte로 표현이 된다고. utf-16은? 2byte였어요. 실제로, mysql에서 length는 문자열의 byte 크기를 리턴해 주는데요. 예제를 보면서 이해해 보도록 하겠습니다.

 먼저 table 2개를 생성하겠습니다. 각각 utf8_table과 utf16_table입니다.

  utf8mb4는 아래 글에서 충분히 설명을 드렸습니다.

[관련글]

utf8mb4는 대체 무엇일까요?

 이모티콘을 넣을 수 있었던 것이 utf8mb4, 그렇지 않았던 것이 utf8이였습니다. 채팅 서버에서 이모티콘을 쓰는 경우가 상당히 많다는 것을 고려를 할 필요가 있어요. 그것 빼고는 utf8 규격과 같다고 보시면 됩니다. 한글 하나는 3byte이고, 영어는 1byte라고 생각하시면 되겠습니다.

 utf16_table의 character set은 utf16입니다. 2byte로 표현이 될 수 없는 영역은 서러게이트 영역 2 2개로 표현이 되는데요. 한글과 영어는 그렇지 않습니다. 따라서, 2byte로 표현이 됩니다.

 다음에, 두 테이블에 똑같이 '조가희' 라는 데이터를 넣었습니다. 이제, mysql length 함수를 이해해 보도록 하겠습니다.

 target이 되는 문자열 하나만 넘겨주면, 그 문자열이 차지하는 바이트 수를 리턴하는 함수가 length입니다.

 stri가 varchar(30)을 담고 있는 필드였습니다. 저는 '조가희' 라는 데이터만 넣었는데요. 실행 결과가 어떻게 나올까요?

 9가 나옵니다. character set이 UTF8MB4였습니다. UTF8의 속성을 그대로 따라간다고 했어요. 그러면 한글은 3byte로 표현이 될 거에요. 한글 3글자면, 3x3 = 9바이트입니다. 구구단 외우는 거 같군요.

 그러면 utf16_table에서는 어떨까요? 역시 같은 데이터가 저장이 되어 있는데요.

 캐릭터 셋이 utf16으로 다릅니다. 이것은, 한글이던 영어던 2byte로 표현이 됩니다. 한 글자당, 총 3글자가 있었나요? 따라서, 2x3 = 6. 6이 리턴이 됩니다. 결론은 캐릭터 셋에 따라서, 같은 데이터라도 length의 결과 값이 달라질 수 있다는 것이에요. 보통 utf8로 많이 처리하시니, 한글은 1글자당 3byte라고 봐도 무난할 듯 싶긴 하지만.. 이러한 특성은 잘 알아두시는 게 좋겠습니다.

 또 다른 예제를 봅시다.

 이번에는 'cho가hui'라는 것을 추가했습니다. 영어 6개, 한글 1개입니다. 그러면 캐릭터 셋이 utf8mb4일 때에는 결과값이 어떻게 나올까요? 이번에는 조금 복잡한 산술 계산이 들어갑니다.

 한글 1개입니다. 개당 3byte인가요? 그리고 영어 6개인데, 1개당 1byte에요. 그러면 3x1 + 6 = 9입니다.

 그런데 utf-16이 캐릭터셋인 경우에는 어떤가요? 영어나 한글이나, 유니코드로 치면 0xFFFF 범위 내에 있나요? 따라서, 한 개당 2byte가 되고, 글자수가 7개니까, 구구단을 외우면 되겠습니다. 2x7 = 14가 됩니다.

Toplist

최신 우편물

태그