인프런 커뮤니티 질문&답변

장계탕님의 프로필 이미지
장계탕

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

채팅 실습

char8_t 관련 protobuf 질문

작성

·

322

·

수정됨

0

google Protobuf에서 한글을 보낼때는 utf8 형식으로 보내야하는 걸로 알고 있습니다. 그래서 u8을 앞에 붙여서 set_name()에 인자를 넣은거구요. 근데 C++언어 표준을 latest 로 해놓고 하면 google protobuf 쪽에서 char8_t 를 지원을 안해주어 컴파일에서 걸렸습니다..

C++ latest 로 지정하고 u8을 하면 문자열이 const char8_t 로 변환되더라구요. 이전 C++ 17 이전으로는 u8을 해도 const char로 변환되었습니다. 그래서 기존에는 컴파일타임에 걸리지 않고 실행이 된것 같습니다.

그래서

이렇게 u8을 쓰지 않고 converter 를 통해 utf8 로 변환 후 패킷을 보냈습니다.

이렇게 하니까 한글이 정상 출력이 되는 걸 확인했습니다..

이런 방식도 나쁘지 않은 방식인가요...?

제가 의심을 하는 이유는

codecvt_utf이 deprecated 된 것인데 경고를 무시하는 코드를 넣고 실행을 돌리기 때문입니다.

C++ latest 에서 사용하기 위해서는 제가 생각한 최선의 방법이었습니다.

좋은 방법이 있을까요

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

char8_t 타입은 C++20에 추가된 유니코드 문자를 위한 타입입니다. UTF-8 문자열 리터럴을 u8 접두어를 붙여 생성할 때, C++20 이전 버전에서는 const char[] 타입이었으나, C++20부터는 const char8_t[] 타입으로 변환됩니다. Google Protobuf는 현재 char8_t 타입을 직접적으로 지원하지 않기 때문에, C++20 버전을 사용할 경우 대응이 필요합니다.

std::wstring_convertstd::codecvt_utf8을 사용하여 UTF-8 문자열로 변환하는 방법을 사용하신 것은 올바른 접근입니다. 하지만, C++17 표준에서 std::codecvt와 관련된 기능들이 deprecated되었음을 고려해야 합니다. 따라서, 장기적인 관점에서 std::wstring_convertstd::codecvt_utf8 대신 다른 방식을 찾아보는 것이 좋습니다.

예를 들어, C++17 이후에는 대안으로 std::filesystem::path를 사용하는 등의 해결책이 있거나, 혹은 C++ 표준 라이브러리 외의 타사 라이브러리를 사용하는 방안도 있습니다. 더 나아가 C++20이나 업데이트된 라이브러리를 사용 시 char8_t를 처리할 수 있는 적절한 방식을 제공할 수 있기를 기대하셔야 할 것입니다.

추가적으로, protobuf가 공식적으로 char8_t를 지원하는 버전을 제공할 때까지 C++20 이하의 버전을 사용하는 것도 한 가지 방법이 될 수 있습니다.

더 좋은 방법을 원하신다면, 커뮤니티나 세미나, 혹은 최신 C++ 동향을 다루는 포럼 및 그룹 등에서 정보를 수집할 수도 있습니다. 때때로 새로운 라이브러리 또는 기술들은 개발자들 사이에서 먼저 소개되고 사용되곤 합니다.

답변이 도움이 되었길 바라며, 프로젝트에 성공하시길 기원합니다.

장계탕님의 프로필 이미지
장계탕

작성한 질문수

질문하기