본문 바로가기
컴퓨터

아스키코드 vs 유니코드

by Luyin 2013. 6. 11.

출처 : 

http://wahaha.tistory.com/36

http://blog.naver.com/tsmwt?Redirect=Log&logNo=100187716113

http://blog.naver.com/smuoon4680?Redirect=Log&logNo=50121299018


Character Sets의 종류와 특성


1. SBCS (Single Byte Character Set) : 문자를 표현하느데 1 byte 사용

ex) 아스키코드

2. MBCS (Multi Byte Character Set) : 한글은 2 바이트, 영문은 1 바이트 사용

3. WBCS (Wide Byte Character Set) : 문자를 표현하는데 2 바이트 사용.

ex) 유니코드


=> 문자 표현을 할 때 MBCS는 일반적으로 효율성을 논하지 않는다. 메모리가 너무 커져서,

=> WBCS 방식은 훨씬 안정적이기 때문에 오히려 더 많이 쓴다.


 아스키 코드 사용 소스코드

#include <stdio.h>
#include <string.h>		//strlen 함수 포함

int main(void)
{
	char str[] = "ABC한글";
	int size = sizeof(str);
	int len = strlen(str);

	printf("배열의 크기: %d \n", size);
	printf("문자열 길이: %d \n", len);

	return 0;
}


실행결과

배열의 길이 : 8

문자열의 길이 : 7


=>sizeof 는 맨 뒤의 널 문자 까지 포함 하고

=>strlen 함수는 널 문자를 제외한 길이를 반환한다.

배열의 크기가 7인 이유는 ABC가 영문이니 1바이트, 한글은 2바이트 1*3 + 2*2 = 7 그리고 null 문자 1바이트 해서 8. 문자열 길이는 5가 아니라 한글 때문에 3+4 = 7 이기 때문이다.


WBCS  기반의 프로그래밍


첫째 : char 를 대신하는 wchar_t

둘째 : "ABC" 대신하는 L"ABC"

셋째 : 유니코드용 전용 함수


를 써야 한다.


 유니코드 사용 소스코드

#include <stdio.h>
#include <Windows.h>	//wcslen() wprintf()함수 포함

int main()
{
	wchar_t str[] = L"ABC";

	int size = sizeof(str);
	int len = wcslen(str);

	wprintf(L"배열의 크기: %d \n", size);
	wprintf(L"문자열 길이 : %d \n", len);

	return 0;
}


strlen함수와 printf 함수는 SBCS 기반 함수이므로 그냥 사용시 에러가 발생한다. WBCS기반의 함수를 써야 한다.

단, sizeof는 함수가 아니라 연산자이므로 상관 없다.


WBCS 기반 함수는 Windows.h 헤더파일 안에 선언 및 정의 되어 있다.


SBCS 함수

WBCS 기반의 문자열 조작 함수

strlen

size_t wcslen

strcpy

wchar_t* wcscpy

strncpy

wchar_t* wcsncpy

strcat

wchar_t* wcstrcat

strncat

wchar_t* wcsncat

strcmp

int wcscmp

strncmp

int wcsncmp

printf

int wprintf

scanf

int wscanf

fgets

wchar_t* fgetws

fputs

int fputws



매개변수 전달인자 유니코드화



=> 데이터형을 wchar_t 을 사용한다.

=> main도 wmain으로 바꾸어 주어야 한다.


  유니코드 매개변수 전달 소스코드

#include <stdio.h>
#include <Windows.h>	//fputws()함수 포함

int wmain(int argc, wchar_t* argv[])
{
	for(int i=1; i<argc; i++)
	{
		fputws(argv[i], stdout);
		fputws(L"\n", stdout);
	}

	return 0;
}