정진하는중

[Windows] 유니코드와 인코딩

 

 

1. 유니코드 (Unicode)

 

윈도우 운영체제는 다양한 국가의 언어를 지원하기 위해서 유니코드 문자를 지원합니다.

또한 인코딩 방식으로 UTF-16 방식을 이용합니다.

 

https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C

 

유니코드 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 유니의 음반에 대해서는 U;Nee Code 문서를 참고하십시오. 유니코드(영어: Unicode, 정식 명칭 The Unicode Standard)는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현

ko.wikipedia.org

 

 

2. UTF(Unicode Transformation Formant)

 

문자 집합(문자셋)을 컴퓨터가 처리할 수 있는 이진 데이터(바이트)로 변환하는 과정이 필요합니다. ( 인코딩 )

 

문자 집합(Character Set):

  • 특정 문자와 각 문자에 할당된 고유한 코드 포인트(숫자 값)의 집합입니다.
  • 예: ASCII, 유니코드.

 

UTF는 유니코드 문자셋을 인코딩하는 방식입니다. 

 

UTF8, UTF16 표현

 

2-1. UTF-8

UTF-8은 가변 길이 인코딩 방식으로, 아스키 코드와 호환되는 인코딩 방식입니다.

 

  • 하나의 문자를 표현하기 위해서 1, 2, 3, 4 바이트의 인코딩을 수행합니다. 
  • 즉, 가변 길이 인코딩 방식입니다.
    아래에 설명하는 문자는 유니코드 표에 대응하는 인덱스입니다.
  • 0x80(16진수, 10진수로 128) 미만의 문자는 아스키 코드와 동일하게 인코딩합니다. ( 1바이트 )
  • 0x80( 16진수, 10진수로 128) 이상, 0x07FF 까지의 문자는 2바이트로 표현합니다.
  • 0x8000 이상의 문자는 3바이트로 표현합니다.
  • U + 10000 이상의 문자는 4바이트로 표현합니다. ( 이모지, 음표....등등 )

 


 

규칙
  1. 1개 바이트를 사용:
    • 가장 큰 비트에 0을 할당하고, 나머지 7비트에 기존의 아스키 코드를 모두 할당한다. 0xxxxxxx 값을 모두 사용하였다. (아직 1xxxxxxx는 사용 가능한 상황이다.)
  2. 사용하려는 바이트가 2개가 넘을 때: 첫 바이트에는 몇바이트를 사용하는지 알려주는 비트를 먼저 넣는다.
    • 2바이트(110), 3바이트(1110), 4바이트(11110)
    • 나머지 바이트에는 여러 바이트에서 연결되었음을 알리는 비트를 먼저 넣는다. 이 때 2바이트 표식을 넣은 데이터와 겹치지 않도록, 10 이라는 비트를 넣어준다.
  3. 표식 비트가 아닌 나머지 비트들은 모두 데이터 비트로 사용한다.

 

즉, 2바이트 이상으로 표현할 때는 첫 번째 바이트의 상위 비트에 바이트 개수에 해당하는 표식 비트를 표현하고

각 바이트의 상위 2자리 비트에 여러 바이트와 연결되어 있음을 알리는 10 비트를 사용한다.

더보기
규칙이 실제로 적용된 값의 표:
바이트에서 1과0으로 표현된 자리는 바이트 크기표시(고정), x 자리는 전부 데이터 비트(변동)이다.
 
유니코드
utf-8로 저장하는 값
자릿수
코드값 범위
첫 바이트
둘째 바이트
셋째 바이트
넷째 바이트
다섯째 바이트
여섯째 바이트
00~07비트
0 ~ 0x7F127
0xxxxxxx
 
 
 
 
 
08~11비트
0x80128 ~ 0x7FF2,047
110xxxxx
10xxxxxx
 
 
 
 
12~16비트
0x8002,048 ~ 0xFFFF65,535
1110xxxx
10xxxxxx
10xxxxxx
 
 
 
17~21비트
0x1000065,536 ~ 0x1FFFFF2,097,151[5]
11110xxx
10xxxxxx
10xxxxxx
10xxxxxx
 
 
22~26비트
(미사용)[6]
111110xx
10xxxxxx
10xxxxxx
10xxxxxx
10xxxxxx
 
27~31비트
(미사용)[7]
1111110x
10xxxxxx
10xxxxxx
10xxxxxx
10xxxxxx
10xxxxxx

 

 

 

이 테이블을 이용해 각각의 유니코드 문자를 UTF-8로 표현해보면 다음 그림과 같다.

 

 

  • 예시 1: 문자 A는 아스키 문자이며 유니코드 값은 65로, 이는 16진수 0x41(0100 0001)인데, 7비트 이내로 표현 가능하므로 UTF-8로도 0x41로 표현된다.
  • 예시 2: 문자 π는 유니코드 값이 7비트를 벗어난다. 그러나 11비트 이내에 표현이 가능한 비교적 앞쪽에 위치한 문자며, 따라서 그림과 같이 2바이트에 표현이 가능 하다.
  • 예시 3: 문자 은 한글 문자로 16비트를 모두 사용한다. 마지막 16비트가 1이며 따라서 이를 표현하기 위해서는 그림과 같이 3바이트를 사용해야 한다. 참고로 유니코드에는 완성형 한글 11,172자뿐만 아니라 조합형 자모가 모두 포함되어 있으며, 이처럼 한글의 UTF-8 인코딩 값은 모두 각 문자당 3바이트를 차지한다.

 

 


 

 

 

 

2-2. UTF-16

 

1 ~ 4 바이트의 가변 길이로 표현하는 UTF - 8 과 다르게 

 

2 바이트 고정 길이를 이용하여 문자를 표현합니다. 

( 4 바이트로 표현하는 영역도 존재합니다 )

 

U+10000부터 U+10FFFF까지 4바이트를 이용하여 표현합니다.

( 본문 2번 항목의 시작에 있는 표를 참조할 수 있습니다. )

 

UTF8, UTF16 표현

 

 

Windows의 커널 내부에서 사용하는 인코딩 방식도 UTF - 16 방식입니다.

 

 

 

 

3. 유니코드 문자(문자열) 함수

 

함수명 설명 헤더 파일
wcscpy_s 유니코드 문자열을 복사합니다. <wchar.h>
wcsncpy_s 유니코드 문자열을 지정된 길이만큼 복사합니다. <wchar.h>
wcscat_s 유니코드 문자열을 연결합니다. <wchar.h>
wcsncat_s 유니코드 문자열을 지정된 길이만큼 연결합니다. <wchar.h>
wmemcpy_s 유니코드 메모리를 복사합니다. <wchar.h>
wmemmove_s 유니코드 메모리를 이동합니다. <wchar.h>
swprintf_s 유니코드 문자열을 포맷하여 지정된 버퍼에 출력합니다. <cwchar>
wcstok_s 유니코드 문자열을 토큰으로 분리합니다. <wchar.h>
_wcsset_s 유니코드 문자열의 모든 문자를 지정된 문자로 설정합니다. <wchar.h>
_wcsnset_s 유니코드 문자열의 처음 n 문자를 지정된 문자로 설정합니다. <wchar.h>
mbstowcs_s 멀티바이트 문자열을 유니코드 문자열로 변환합니다. <cstdlib>
wcstombs_s 유니코드 문자열을 멀티바이트 문자열로 변환합니다. <cstdlib>
_wctime_s time_t 값을 유니코드 문자열로 변환합니다. <ctime>
_wstrtime_s 현재 시간을 유니코드 문자열로 변환합니다. <ctime>
_wstrdate_s 현재 날짜를 유니코드 문자열로 변환합니다. <ctime>
_wcreat_s 유니코드 문자열 경로를 사용하여 파일을 생성합니다. <io.h>
_wfopen_s 유니코드 문자열 경로를 사용하여 파일을 엽니다. <cstdio>
_wfreopen_s 유니코드 문자열 경로를 사용하여 파일을 다시 엽니다. <cstdio>
_wtmpnam_s 임시 파일 이름을 유니코드 문자열로 생성합니다. <cstdio>
_wctomb_s 유니코드 문자를 멀티바이트 문자로 변환합니다. <stdlib.h>
_wcserror_s 유니코드 문자열로 오류 메시지를 반환합니다. <wchar.h>

 

 

 

wchar_t는 "wide character" 타입으로, C++ 표준에서 유니코드 문자를 저장하기 위해 정의된 데이터 타입입니다. wchar_t는 일반적인 char 타입과 달리 넓은 문자(보통 2바이트 또는 4바이트 크기)를 저장할 수 있으며, 이는 다국어 지원과 유니코드 문자 처리를 가능하게 합니다.

 

윈도우에서는 2바이트로 표현합니다.

wchar_t 자료형, L"문자열"

 

 

문자열 리터럴의 앞에  L "유니코드 문자열" 

L 접두사를 통해 유니코드 문자열을 나타낼 수 있습니다.

 

 

출력 결과

 

'WINDOWS > 운영체제' 카테고리의 다른 글

[Windows] 가상 메모리와 물리 메모리  (0) 2024.06.16
[Windows] 윈도우의 메모리 구조  (0) 2024.06.15

댓글