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. 핵심 차이 요약
| 구분 | 바이트 수 | 특징 |
|---|---|---|
| SBCS | 1바이트 | 단순, 영어 전용 |
| MBCS | 가변 | 효율적이지만 처리 복잡 |
| WBCS | 고정(2바이트 이상) | 안정적, 글로벌 지원 |
3. 왜 MBCS가 문제인가
문자열 "가A" 같은 경우
- 길이: 2글자
- 메모리:
- “가” → 2바이트
- “A” → 1바이트
→ 총 3바이트
즉,
length = 2sizeof = 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
- SBCS →
즉,
- 코드 호환성 유지용 매크로
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-8 | 1~4바이트 가변 길이. 영어는 1바이트라 저장 효율 좋음 |
| UTF-16 | 2 또는 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_t | UTF-16 코드 유닛 |
| char32_t | UTF-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*
파일 경로, 콘솔 입출력, 네트워크 문자열 처리할 때 자주 필요하다.
같이 정리하면 좋은 흐름
지금 정리한 내용 뒤에 이런 순서로 붙이면 좋다.
- ASCII와 Unicode
- SBCS / MBCS / WBCS
- 코드 페이지
- UTF-8 / UTF-16 / UTF-32
- Windows의 ANSI API와 Unicode API
- TCHAR / _T 매크로
- main / wmain 차이
- 문자열 변환 함수
특히 WinAPI 기준이면 코드 페이지, CreateWindowA/W, TCHAR, MultiByteToWideChar 이 4개는 꼭 같이 알아두는 게 좋다.
문자열 / 인코딩 / string·wstring 면접 질문
- ASCII와 유니코드 차이를 설명해보세요
- 유니코드와 UTF-8의 차이는 무엇인가요?
- SBCS, MBCS, WBCS의 차이를 설명해보세요
- MBCS의 문제점은 무엇인가요?
- 코드 페이지란 무엇인가요?
- UTF-8과 UTF-16의 차이는 무엇인가요?
- char* 문자열이 깨지는 이유는 무엇인가요?
- string과 wstring의 차이를 설명해보세요
- string이 유니코드를 지원하지 않는다는 말이 맞나요?
- Windows에서 string보다 wstring을 쓰는 이유는?
- string과 wstring 변환은 어떻게 하나요?