Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-16 20:20
관리 메뉴

nomad-programmer

[Programming/C] 문자 코드 본문

Programming/C

[Programming/C] 문자 코드

scii 2021. 1. 15. 02:50

컴퓨터는 메모리에 0과 1만을 저장할 수 있으므로 컴퓨터는 문자를 표현하기 위해 각각의 문자와 대응하는 숫자를 정의하고 있는데 이것을 문자 코드라 한다.

대표적인 문자 코드가 ASCII 코드이며 영문자, 숫자, 기호 등을 ANSI 라는 표준화 기구에서 정의한 7비트 문자 코드(0~127) 이다. 그래서 ASCII코드를 ANSI코드라고도 한다. 정확히 말하면 ANSI코드는 ASCII 코드에 1비트를 더확장(128~255)하여 정의한 8비트 문자 코드이다. C언어에서는 ASCII코드를 사용하여 문자를 표현한다.

사실 ASCII코드 외에도 많은 문자 코드가 존재하며 문화, 지역, 나라, 운영체제, 성능 등 여러 가지 요소들에 따라 문자 코드의 정의와 사용이 다랄져야 하기 때문에 문자 코드는 상당히 복잡하다.

이러한 문제점을 해결하고자 국제 표준화 기구에서 전 세계적으로 유일하게 정의된 문자 집합을 정의했는데 이것을 유니코드(UNICODE)라 한다.

유니코드는 여러 가지 형태로 인코딩될 수 있으며 C언어는 2바이트 인코딩 유니코드 형식을 지원한다.

C언어는 아스키 코드와 유니코드 문자를 지원하며 아스키 코드 문자는 char형(1바이트)을 사용하고 유니코드 문자는 wchar_t형(2바이트)을 사용한다. 또한 C언어의 모든 문자열 관련 함수는 아스키 코드 형태와 유니코드 형태의 함수를 지원한다. 
아스키 코드의 출력 함수 printf가 있다면 유니코드의 출력 함수에는 wprintf()가 있다.

ASCII 문자는 1바이트 문자로 'A', 'B', 'C', ... 등으로 나타낸다. 유니코드 문자는 2바이트 문자로 L'A', L'B', L'C', ... 등으로 L자를 붙여 나타낸다.

다음은 아스키와 유니코드의 예이다.

#include <stdio.h>

int main()
{
	char c = 'A';
	wchar_t wc = L'A';

	printf("ASCII: %c\n", c);
	wprintf(L"UNICODE: %c\n", wc);

	printf("ASCII: %d\n", sizeof(c));
	printf("UNICODE: %d\n", sizeof(wc));

	const char* s = "ABC";
	const wchar_t* ws = L"ABC";

	printf("ASCII: %s\n", s);
	wprintf(L"UNICODE: %s\n", ws);

	char sarr[] = "ABC";
	wchar_t wsarr[] = L"ABC";

	printf("ASCII: %s\n", sarr);
	wprintf(L"UNICODE: %s\n", wsarr);

	printf("ASCII: %d\n", sizeof(sarr));
	printf("UNICODE: %d\n", sizeof(wsarr));

	return 0;
}


/* 결과 
ASCII: A
UNICODE: A
ASCII: 1
UNICODE: 2
ASCII: ABC
UNICODE: ABC
ASCII: ABC
UNICODE: ABC
ASCII: 4
UNICODE: 8
*/

다음은 아스키 코드 문자열과 유니코드 문자열 관련 함수를 사용한 예이다. 

#pragma warning (disable: 4996)

#include <stdio.h>
#include <string.h>

int main()
{
	char s[100] = "ABC";
	wchar_t ws[100] = L"ABC";

	printf("ASCII: %S\n", s);
	wprintf(L"UNICODE: %s\n", ws);

	strcpy(s, "Hello!");
	wcscpy(ws, L"Hello!");

	printf("ASCII: %s\n", s);
	wprintf(L"UNICODE: %s\n", ws);

	strcat(s, "+String");
	wcscat(ws, L"+String");

	printf("ASCII: %s\n", s);
	wprintf(L"UNICODE: %s\n", ws);

	printf("s String Length: %d\n", strlen(s));
	printf("ws String Length: %d\n", wcslen(ws));

	return 0;
}


/* 결과

ASCII: UNICODE: ABC
ASCII: Hello!
UNICODE: Hello!
ASCII: Hello!+String
UNICODE: Hello!+String
s String Length: 13
ws String Length: 13

*/
Comments