Jazyk C národní kódování neřeší vůbec. C++ řeší kódování používáním wstring (a typu wchar_t; wstring je v podstatě pole hodnot typu wchar_t). Problém je způsoben tím, že různé operační systémy používají Unicode různě.
Linux používá utf-8, všude (resp. podle proměnné $LANG). Tam problémy zpravidla nejsou. Mac taky. Windows používají tři různá kódování: utf-16, windows-xxxx a pak ještě nějaká historické sady (u nás PC Latin 2). Problém je ten, že utf-16 je dvoubajtové kódování, takže musíš překladači explicitně říct, který řetězec v kódu má být ve dvoubajtovém kódování a který v jednobajtovém. Rodina windows-xxxx se použije, pokud je vstup/výstup jednobajtovej a z něho se překódovává na to utf-16. Bohužel, těch znakových sad je samozřejmě spousta, takže i když budeš psát ve windows-1250, bude ti to chodit pouze na Windows se středoevropskou lokalizací, jinde ne. A konečně třetí znaková sada se použije, pokud se vypisuje do terminálu. To je z historických důvodů, problémy samozřejmě stejné jako u windows-xxxx, jen se do toho vnáší ještě větší chaos.
Jediné řešení je používat wstring a wchar_t a všechno důsledně překódovávat. Typ wchar_t má na Linuxu i Windows velikost 2 bajty, na Macu 4 bajty. Typ wstring pak používá na Linuxu a Windows utf-16, na Macu utf-32. Pro zdrojáky programu pak použij všude utf-8 (s windows-1250 by sis nepomohl, naopak!).
Více viz manuál tvého překladače, u každého se to dělá trochu jinak a celkově je to masakr. Zejména při používání dalších knihoven, který třeba vrací zase jiný typ řetězce. Celkově jsem rád, že pro Windows už programovat nemusím
