std::transform 사용시 주의사항

한글이 포함된 문자열에 std:transform 를 사용할 때 주의사항


문제

오래 전부터 발생했던 문제였던거 같은데 이제와서 유저에 의해서 발견됬다. 유저가 게임 내 아이디를 영문으로 입력할 때, 서버 및 DB 에서는 대문자 기준으로 저장을 한다. 따라서, std::transform 함수를 이용하여 문자열 전체를 대문자로 변경하는 로직이 있었다. 아래와 같은 코드이다. 문제는 한글이 포함되어 있는 경우에 다른 한글로 변경되는 문제가 발생했다.


원인

이러한 문제가 발생한 원인은 간단했다. std::transform 는 1byte 마다 upper 를 진행하는대, 한글은 2byte 가 한 개의 문자이기 때문에 발생한 것이다. 그리고 엄밀히 말하면 한글은 upper 를 할 필요도 없다.


해결

해결방법으로는 아래의 코드와 같이 1byte 마다 한글 여부를 확인을 해서 한글이면 upper 를 건너뛰고, 영문일 때만 upper 를 하도록 수정했다.




Reply