mbrtoc32
와 mbrtoc16
등 문자 인코딩과 관련된 표준 라이브러리 함수가 오작동하는 경우가 있었다.
나는 TDM-GCC 10.3.0을 사용하고 있었는데,
MinGW-w64 등에서 주로 사용하는 구식 MSCRT(Microsoft Visual C++ Runtime) 구현의 문제였다.
mbrtoc16
은 그냥 mbrtowc
를 그대로 사용하고 있는데,
setlocale(LC_ALL, "en_US.utf8");
을 해도
로케일에 영향받는 mbrlen이 항상 1을 반환해서 생기는 문제였다.
최신 UCRT(Universal C Runtime)에서는 UTF-8 로케일을 지원하는데 구식 런타임에는 이게 안 된다.
기존에 내가 사용하던 TDM-GCC, Mingw-builds 배포는 MSCRT를 사용해 동일한 문제가 발생한다.
UCRT를 사용하는 배포는 WinLibs가 존재한다.
https://winlibs.com/
거기에 더해 WinLibs는 Clang과 LLDB 등 LLVM 기반의 프로그램도 같이 포함해서 배포하고 있다. 많이 유용하다.
TDM-GCC을 한참 애용하고 있었는데 이 문제로 잠시 갈아타게 됐다.
https://jmeubank.github.io/tdm-gcc/