2020년 7월 1일 수요일

C++ 한글 ?? 될 때, 깨질 때



어??

글자는 3가지 방식으로 코딩된다.

1. SBCS - Single Byte Chacter Set -

ASKII 가 해당됨. 1바이트로 표현하기 때문에 최대 128개만 가능. 영어, 숫자 정도만 표현 가능하다.

char이 1바이트인 까닭. char* 로 문자열이 가능하다.

2. MBCS - Multi Byte Chacter Set -

SBCS에서 다른 글자도 표현하기 위해 도입. 아스키와 호환되는 것이 가장 큰 특징이고 윈도우에서도 쓰고 있다.

1바이트로는 기존 아스키를, 2바이트로는 다른 특수문자를 표현한다.

char*로 문자열을 표현한다.

3. 유니코드

모두 동등하게 2바이트 혹은 4바이트로 고정함. UTF-8이 유명. 하지만 아스키와 호환이 안됨(UTF-8 제외). 유니코드로 가는 추세지만 전환기임.

wchar로 글자 하나를, 문자열은 wchar*로 표현이 가능함.

하지만 유니코드도 종류도 많고, 유니코드라도 w_char 다루는 함수들에게 locale 정보를 줘야한다.

그래서 아래의 함수가 필요하다.

#include<locale.h>

_wsetlocale( LC_ALL, L"korean" ); //지역화 설정을 전역적으로 적용할

wcout.imbue( locale("korean") ); //전역 아니고 출력시만 적용할 때

wcin.imbue( locale("korean") ); //전역 아니고 입력시만 적용할 때

글로벌한 언어를 커버하기 위해 c++은 두가지 자료형을 준다.

하나가 TChar이고 다른 하나가 wchar.

참고로 TChar은 char과 wchar 두가지 모두 커버해서 애매모호하다고, 타입이 중요하면 쓰지 말라고 한다.

왠만하면 char만 쓰고 어쩔 수 없을 때 wchar 쓰라고.

char이 아스키 외에는 받지 못하는 것과

wchar_t에서 다른 글자가 정수와 캐릭터로 어떻게 표현되는지

아래 코드가 보여준다.

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

32

#include<iostream>

#include<locale.h>

#include<string>

#define UNICODE

using namespace std;

int main()

{

_wsetlocale(LC_ALL, L"korean"); //지역화 설정을 전역적으로 적용

string a = "아이폰";

char b = '葡';

wchar_t c = '葡';

wchar_t d = L'葡';

cout << "a 크기는" << " " << sizeof(a) << endl;

cout << "b 크기는" << " " << sizeof(b) << endl;

cout << "c 크기는" << " " << sizeof(c) << endl;

cout << "d 크기는" << " " << sizeof(d) << endl;

cout << "a 내용은" << " " << a << endl;

cout << "b 내용은" << " " << b << endl;

cout << "c 내용은" << " " << c << endl;

cout << "d 내용은" << " " << d << endl;

wcout << L"d 내용은" << " " << d << endl;

cout << endl;

cout << "한글 되냐" << endl;

cin.get();

return 0;

}

b는 char 로 해석 안되서 저렇게 출력 안된 듯

댓글 없음:

댓글 쓰기

List