요새 윈도우 시스템 프로그래밍 공부를 시작했는데
윈도우 프로그래밍 보면 유니코드라는 게 있잖아
Petzold 책 보면 어떤 지시자가 정의되어 있으면
함수들이 전부 문자를 2바이트 기준으로 처리하고
아니면 1바이트 기준으로 처리한다고 하던데,
가끔 보면 어떤 경우에는 이게 프로그램 내에서 뒤죽박죽 되는 경우가 있더라고.
예를 들면 당근 프로젝트라고 윈API로 텍스트 편집기 만드는 프로젝트가 있는데
거기서 한글입력편집기(IME) 관련 함수들은 죄다 1바이트 기준으로 작동하는데
다른 윈API 함수들은 2바이트 유니코드 기준으로 작동해서 이거 일치시키는 게 상당히 어렵더라고.
또 윈도우 API 이용한 파일 복사 콘솔 예제에서
main()이 명령 인자로 파일 이름을 받는데
1바이트 기준으로 받더라고...... TCHAR 형식으로 받아도 나열은 그냥 1바이트처럼 되어서 파일명이 자꾸 깨져.
CreateFile() 같은 함수에 넣어보니 작동이 제대로 안 되더라고.
그래서 이 문자열을 유니코드 기준(2바이트)으로 바꿔서 API 함수에 넣어줘야 하는데
이런 게 좀 번거롭고 복잡한 것 같아서... 실수도 많이 하게 될 것 같고...
예제랑 자꾸 다르게 코딩해야 하니 뭔가 찜찜하기도 하고...
그래서, 내가 묻고 싶은 건 코딩할 때는 윈도우 API 함수들이 대부분 유니코드 기준으로 작동하는데
이걸 그냥 1바이트 기준으로 작동할 수 있게 정의하는 방법이 있어?
(좀 더 정확히 말하면 예를 들어 CreateFileW()함수가 아닌 그냥 CreateFileA()함수가 선택되게 하는 방법)
이를 테면, #define을 이용해서 유니코드 아닌 1바이트 기준으로 함수들이 정의되게 하는 방법 같은 거......
아니면 다른 방법이라도......
win32에서는 CreateFile 이라는 API 함수의 경우 두가지 버전이 있어. 하나는 니가 말한 CreateFileW 가 있고, 다른 하나는 CreateFileA 가 있어.
정확히 기억이 안나지만, 컴파일시에 preprocessor 에서 __UNOCODE__ 라는 predefined 값이 정의되어 있는경우 , 코드상에서 CreateFile 로 기술하면, CreateFileW 로 컴파일시에 바껴. 반대로 __UNICODE__ 가 정의되지 않은경우에는, CreateFile 이라는 함수는 컴파일시에 CreateFileA로 바껴.
그럼 프로젝트 설정 같은 걸 바꿔줘야 하는 건가? 난 아무것도 안 해도 __UNICODE__가 이미 정의되어 있는 것 같던데......
지금 프로젝트 설정을 보니까 일반, \'문자집합\'에 \"유니코드 문자 집합 사용\"이란 것과 \"멀티바이트 문자 집합 사용\"이란 옵션이 있는데 멀티바이트 문자집합을 쓰면 CreateFileA()로 바뀌는 건가?
컴파일옵션에사 preprocessor 정의부에 __UNICODE__ 를 정의하지 않으면 , 니가 프로그램작성할때 호출하는 대부분의 API함수들은 유니코드용이 아닌 니가 말하는 \"1바이트용 함수\" (끝이 CreateWindowA 와 같은) 를 호출해.
어. 멀티바이트 문자집합(MBCS)을 선택하면돼.
근데 문제는. 특정 함수는 유니코드용으로만 빌드되서 제공되는경우가 있는데, 아마 책에서 말하는건 이 경우를 말해
즉, Sum 이라는 함수가 SumW 만 제공되고, SumA는 제공안되는경우야. 이때는 SumW로 전달되는 문자열 파라미터를 모두 유니코드로 변환시켜줘야해. 책에서는 아마 그런걸 말한거일듯 하다
오! 된다...... 진짜 고마워 ㅎㅎ 간단히 해결되는데 괜히 생고생 했네