C++프로그래밍/C 와 C++ 기초실습

문자와 문자열 (유니코드)

season97 2024. 9. 15. 21:30

※ C / C++을 이미 알고 있으나 개인적인 공부 및 복습을 위해 포스팅 하는 글이므로

C++에 대한 구체적인 정보를 담고 있지 않습니다.

 

 

▶ 문자

ㆍ  char : 알파벳 / 숫자 문자를 나타낸다
ㆍ  wchar_t : 유니코드 문자를 나타낸다

#include <iostream>
using namespace std;

// bool은 그냥 정수지만, 참 거짓을 나타내기 위해 사용한다
// 사실char도 마찬가지, 그냥 정수지만 문자의 의미를 나타내기 위해 사용

// char : 알파벳 / 숫자 문자를 나타낸다
// wchar_t : 유니코드 문자를 나타낸다

//ASCII 코드 (American Standard Code for Information Interchange)
char ch = 97;
//일반적으론 char ch = 'a'; 이런식으로 사용된다
int main()
{
	cout << ch << endl;
	//어라? 97을 입력했는데 a가 출력된다! ASCII 코드
}

 

 

※ 알게된 사실

ㆍ char 그냥 정수지만 문자의 의미를 나타내기 위해 사용. 즉, 연산도 가능하다는 소리다 (ASCII)

char ch3 = 'a' + 1;
int main()
{
	cout << ch3 << endl; //b출력
}

▶ 유니코드란?

국제화 시대에서는 영어만으로 서비스를 할 수 없다.....

ㆍ 전 세계의 문자와 기호를 통합하여 표현하기 위해 설계된 인코딩 표준. 

ㆍ 다양한 언어의 문자를 컴퓨터에서 일관되게 표현하고 처리할 수 있도록 지원한다.

 

▶ 유니코드의 인코딩 방식인 UTF8 UTF16에 대해

 

1. UTF8

ㆍ 알파벳, 숫자는 1바이트로 표기된다 (아스키문자의 0~127번은 1바이트로 표기)

 

ㆍ 유럽지역의 문자는 2바이트, 한글 한자 등은 3바이트.. 또한 어떤건 4바이트로 표기된다

 

ㆍ UTF8은 ASCII와 호환 된다. 

 

ㆍ 웹페이지, 이메일, 데이터베이스 등에서 많이 사용된다.

 

2. UTF16 

ㆍ 대부분이 2바이트로 표기된다. (기본 다국어 평면(BMP)에 속하는 문자는 2바이트)

 

ㆍ 극히 예외적인 고대 문자만 4바이트로 표기된다(BMP를 넘어서는 문자)

 

특징 UTF8 UTF16
인코딩 방식 1~4 2 (극히드물게4)
메모리 효율성 아스키 문자가 많으면 효율적, 비아스키 문자는 더 많은 바이트 사용 대부분의 언어에서 그냥 문자당 2바이트 사용
호환성  아스키와 완벽히 호환 아스키 호환 안댐
사용 용도 웹, 이메일 등등 특정 플랫폼이나 언어(java,C#)

 

 

▶ C++에서 UTF16을 저장하는게 바로 wchar_t 이다

 

ㆍ whar_t는 L'문자' 이런식으로 앞에 L을 붙혀줘서 표기해줘야한다.

wchar_t wch = L'안'; 

int main()
{
	//cout << wch << endl;  //50504 출력
	
    wcout.imbue(locale("kor"));
	wcout << wch << endl; //정상적으로 '안' 출력
}

 

ㆍ 그냥 cout을 하면 cout이 char 전용이기 때문에 50504라는 이상한 값이 출력된다

 

ㆍ 그럼 wchar_t를 출력하고싶다면?? -> wcout을 해야한다 근데...

 

ㆍ 기본적으로 한국어를 인식하지못해서 wcout.imbue(locale("kor"));을 입력해줘야 한다

ㆍ 추가로 마우스를 올려서 나오는0xc548 을 입력해도 '안'이라는 문자가 출력된다

 

▶ Escape Sequence


 ㆍ 표기하기 애매한 애들을 표현한다


1.  \t = 아스키코드9 = Tab

 

2. \n = 아스키코드10 = LineFeed (한줄아래로)


3.  \r = 아스키코드13 = CarriageReturn (커서 <<)


ㆍ 그 이외에도 된다. 예를들어 아래 예시코드다

wchar_t test2 = '\'';


int main()
{
	wcout << test2 << endl;  // '이 출력된다
}

 

※ 특수문자 표기는 \ 를 적극적으로 이용하자

 

결론: 문자는 그냥 숫자에 불과하고, 그 숫자를 문자로 인코딩해주는 약속이 있을 뿐이다.