Zařídit to jde. Záleží na tom, jaké budeš požadovat kódování. Pokud se rozhodneš pro utf-8, můžeš nadále používat char s tím, že jeden unicode znak bude složen z jedno až čtyř "charů". Ve Windows API se používá UTF-16. S UTF-16 můžeš použít buď wchar_t na Windows (na Windows je 2B, ale v Linuxu je 4B, takže tam ne),
Pokud má být aplikace multiplatformní, nezbyde ti nic jiného než použít nějaký 16b typ, jako třeba uint16_t (stdint.h). Ten ale nemusí být přítomen ve všech implementacích, není to typ, co prostě musí existovat na dané platformě, máš ale standardem v podstatě zaručeno, že pokud platforma má 16bit typ, uint16_t bude existovat. stdint.h není přítomný ve Visual Studio až do verze 2010, protože MS ho bere jako C++ kompilátor, né C a proto jeho podpora standardů jazyka C může být špatná. Pokud ti nebude vadit spoléhat se na "novinky", můžeš použít char16_t z C11 a zapsat string s u literálem: const char16_t* utf16_string = u"můj utf-16 string";
char16_t (a char32_t) jsou kromě C11 i součástí standardu C++11, takže aplikace může být zkompilována i novějšími C++ kompilátory. Možná Visual Studio by to mohlo vzít, protože nějakou tu podporu C++11 má, GCC a clang kompilátory podporují již většinu z C++11 a pár "věcí" z C11 taky.
Ať ale použiješ jakékoliv kódování a datový typ, stejně se pak nemusíš vyhnout dalším převodům kódování či znakových sad. Na Windows to bude ok, pokud použiješ utf-16, protože WinAPI fce to očekávají, na jiných platformách ale můžeš mít problém. Na linuxu se často používá utf-8.