[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는 유니코드 문자셋을 인코딩하는 방식입니다.
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개 바이트를 사용:
-
가장 큰 비트에 0을 할당하고, 나머지 7비트에 기존의 아스키 코드를 모두 할당한다. 0xxxxxxx 값을 모두 사용하였다. (아직 1xxxxxxx는 사용 가능한 상황이다.)
-
-
사용하려는 바이트가 2개가 넘을 때: 첫 바이트에는 몇바이트를 사용하는지 알려주는 비트를 먼저 넣는다.
-
2바이트(110), 3바이트(1110), 4바이트(11110)
-
나머지 바이트에는 여러 바이트에서 연결되었음을 알리는 비트를 먼저 넣는다. 이 때 2바이트 표식을 넣은 데이터와 겹치지 않도록, 10 이라는 비트를 넣어준다.
-
-
표식 비트가 아닌 나머지 비트들은 모두 데이터 비트로 사용한다.
즉, 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비트
|
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번 항목의 시작에 있는 표를 참조할 수 있습니다. )
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바이트로 표현합니다.
문자열 리터럴의 앞에 L "유니코드 문자열"
L 접두사를 통해 유니코드 문자열을 나타낼 수 있습니다.
'WINDOWS > 운영체제' 카테고리의 다른 글
[Windows] 가상 메모리와 물리 메모리 (0) | 2024.06.16 |
---|---|
[Windows] 윈도우의 메모리 구조 (0) | 2024.06.15 |
댓글