-
문자열 인코딩 변환 매크로 주의사항 (W2A, A2W)MFC 2018. 1. 29. 14:31
유니코드와 멀티바이트 문자열을 상호변환하는데 있어 가장 간편한 것이, 제공되는 함수를 사용하는 것일테다.
USES_CONVERSION; 만 사용하면, 여러 변환 매크로들을 사용할 수 있기에 종종 사용했었다.
A2W, W2A 같은 매크로들이다.
W : 유니코드
A : ANSI 문자열
헌데, W2A는 변환과정에서 내부스택을 사용하기 때문에, 반복문 안에서 사용하면 스택오버플로우가 발생한다.
그래서 찾은게 CW2A, CA2W 등 이다.
이는 ATL7.0에 도입된 클래스와 매크로로, 클래스 내부에 128만큼 버퍼를 갖고있고, 이를 넘어서는 경우 힙에 메모리를 할당한다고 하며, 루프 안에서도 사용가능하며 스택오버플로우되지 않는다고 한다.
필자는 for문안에서 다량의 W2A_EX를 사용했고, 또한 반복 횟수가 많아서 오버플로우 문제로 골치를 썩었는데, W2A_EX를 모두 CW2A로 바꾸고나니 오버플로우가 발생하지 않았다.
앞으로 문자열 인코딩 변환 매크로는 CW2A 계열을 사용하도록 하자.
참고로 CW2A를 CString 의 Format 안에서 사용하면 에러가 난다.