1. 문자 인코딩 방식 개념

SBCS (Single Byte Character Set)

  • 문자 하나 = 1바이트
  • 대표: ASCII
  • 특징
    • 최대 256개 문자 표현
    • 영어 중심
    • 메모리/처리 단순

MBCS (Multi Byte Character Set)

  • 문자마다 바이트 수가 다름 (1~2바이트 이상)
  • 대표: EUC-KR, Shift-JIS 등
  • 특징
    • 아시아권 문자 표현 가능
    • 가변 길이 인코딩
  • 문제점 (중요)
    • 문자열 길이 ≠ 메모리 크기
    • 인덱스 접근이 불안정
    • 한 글자를 기준으로 순회하기 어려움
    • 문자열 잘라내기/탐색 시 오류 가능

WBCS (Wide Byte Character Set)

  • 문자 하나를 고정된 큰 크기로 표현 (보통 2바이트 이상)
  • 대표: Unicode
  • 특징
    • 전 세계 문자 표현 가능
    • 고정 길이 기반이라 처리 안정적
    • MBCS 문제 해결

2. 핵심 차이 요약

구분바이트 수특징
SBCS1바이트단순, 영어 전용
MBCS가변효율적이지만 처리 복잡
WBCS고정(2바이트 이상)안정적, 글로벌 지원

3. 왜 MBCS가 문제인가

문자열 "가A" 같은 경우

  • 길이: 2글자
  • 메모리:
    • “가” → 2바이트
    • “A” → 1바이트
      → 총 3바이트

즉,

  • length = 2
  • sizeof = 3

이 불일치 때문에

  • index 접근 (str[i])이 문자 기준이 아님
  • 중간에서 잘리면 깨짐

4. WBCS 기반 프로그래밍 (Windows 기준)

  • char 대신 wchar_t 사용
  • WinAPI는 내부적으로 유니코드 기반

엔트리 포인트 차이

int main(int argc, char* argv[])

→ 유니코드 환경

int wmain(int argc, wchar_t* argv[])


TCHAR

  • TCHAR = 상황에 따라 자동 변환
    • SBCS → char
    • Unicode → wchar_t

즉,

  • 코드 호환성 유지용 매크로

5. 실전 관점 정리

  • 과거: SBCS → MBCS (다국어 대응)
  • 현재: 거의 전부 유니코드(UTF 기반)

결론:

  • 지금은 MBCS 직접 쓰는 경우 거의 없음
  • 대부분 UTF-8 또는 UTF-16 사용
  • 문자열 처리는 “바이트”가 아니라 “문자 단위” API로 다뤄야 안전

추가로 알면 좋은 개념

1. 문자 집합과 인코딩의 차이

  • 문자 집합: 어떤 문자들을 표현할 것인가
    • 예: Unicode
  • 인코딩: 그 문자를 바이트로 어떻게 저장할 것인가
    • 예: UTF-8, UTF-16, UTF-32

즉, 유니코드는 “문자 목록/번호 체계”이고, UTF-8/16/32는 “저장 방식”이다.


2. UTF-8 / UTF-16 / UTF-32

구분특징
UTF-81~4바이트 가변 길이. 영어는 1바이트라 저장 효율 좋음
UTF-162 또는 4바이트. Windows 내부 문자열에서 많이 사용
UTF-32항상 4바이트. 단순하지만 메모리 사용량 큼

중요한 점은 유니코드 = 무조건 2바이트가 아니라는 것.


3. 코드 페이지

  • 바이트 값을 어떤 문자로 해석할지 정해 놓은 표

Windows에서 특히 중요하다.

  • 같은 char 문자열이라도 어떤 코드 페이지로 해석하느냐에 따라 결과가 달라짐
  • 예: CP949, UTF-8, Shift-JIS
  • 그래서 한글이 깨지는 문제의 원인이 되는 경우가 많음

char text[] = “한글”;

이 문자열은 소스 파일 인코딩, 컴파일러 설정, 실행 환경의 코드 페이지에 따라 다르게 해석될 수 있다.


4. ANSI 함수와 Unicode 함수

WinAPI에는 보통 두 버전이 있다.

CreateWindowA(); // ANSI/MBCS 기반
CreateWindowW(); // Unicode 기반

그리고 매크로로 감싸진 함수가 있다.

CreateWindow();

프로젝트가 Unicode 설정이면 CreateWindowW로,
MBCS 설정이면 CreateWindowA로 치환된다.


5. 문자열 리터럴 접두사

“abc” // const char*
L”abc” // const wchar_t*
u8”abc” // UTF-8 문자열
u”abc” // char16_t 문자열
U”abc” // char32_t 문자열

Windows API를 쓸 때는 보통 L"문자열" 또는 _T("문자열")을 자주 보게 된다.


6. wchar_t, char16_t, char32_t 차이

타입의미
char보통 1바이트 문자
wchar_t플랫폼에 따라 크기가 다름
char16_tUTF-16 코드 유닛
char32_tUTF-32 코드 유닛

주의할 점:

  • Windows의 wchar_t는 보통 2바이트
  • Linux의 wchar_t는 보통 4바이트

즉, wchar_t == Unicode라고 단순화하면 위험하다.


7. 바이트 수, 문자 수, 화면 출력 폭

문자열에서 “길이”는 여러 의미가 있다.

std::string text = u8”가나다”;

  • 바이트 수: UTF-8 기준 9바이트
  • 문자 수: 3글자
  • 배열 크기: 널 문자 포함 시 더 커짐
  • 화면 폭: 글자 종류에 따라 다를 수 있음

시스템 프로그래밍에서는 이 차이를 구분해야 한다.


8. 문자열 변환

WinAPI에서 자주 등장한다.

MultiByteToWideChar();
WideCharToMultiByte();

  • char*wchar_t*
  • wchar_t*char*

파일 경로, 콘솔 입출력, 네트워크 문자열 처리할 때 자주 필요하다.


같이 정리하면 좋은 흐름

지금 정리한 내용 뒤에 이런 순서로 붙이면 좋다.

  1. ASCII와 Unicode
  2. SBCS / MBCS / WBCS
  3. 코드 페이지
  4. UTF-8 / UTF-16 / UTF-32
  5. Windows의 ANSI API와 Unicode API
  6. TCHAR / _T 매크로
  7. main / wmain 차이
  8. 문자열 변환 함수

특히 WinAPI 기준이면 코드 페이지, CreateWindowA/W, TCHAR, MultiByteToWideChar 이 4개는 꼭 같이 알아두는 게 좋다.


문자열 / 인코딩 / string·wstring 면접 질문

  1. ASCII와 유니코드 차이를 설명해보세요
  2. 유니코드와 UTF-8의 차이는 무엇인가요?
  3. SBCS, MBCS, WBCS의 차이를 설명해보세요
  4. MBCS의 문제점은 무엇인가요?
  5. 코드 페이지란 무엇인가요?
  6. UTF-8과 UTF-16의 차이는 무엇인가요?
  7. char* 문자열이 깨지는 이유는 무엇인가요?
  8. string과 wstring의 차이를 설명해보세요
  9. string이 유니코드를 지원하지 않는다는 말이 맞나요?
  10. Windows에서 string보다 wstring을 쓰는 이유는?
  11. string과 wstring 변환은 어떻게 하나요?