Tak jak w temacie, kiedyś słyszałem o jakiś rozszerzeniu charów tak żeby char przechowywał więcej niż jeden bajt.
Wszystko rozbija się o kodowanie.
Na Windows jest od tego ustawienie systemowe i jest to zwykle Windows-1250 (jedno bajtowe kodowanie zawierające polskie znaki).
Na Linux i podobnych zwykle używa się UTF-8, gdzie jeden znak reprezentowany jest przez od 1go do 4 bajtów, więc równocześnie pokryte są wszystkie języki.
Zwykle to oznacza, że w swoim kodzie C, nie musisz robić specjalnych rzeczy by móc korzystać z tych znaków.
Jedyny problem pojawia się podczas przetwarzania napisów. W kodowaniach jedno bajtowych jest to w miarę proste.
W przypadku UTF-8 jest to bardziej skomplikowane. Przykładowo kodowanie UTF-8 ie jest jednoznaczne (jeden napis można reprezentować na kilka sposobów).
Konwersja do wtchar*
upraszcza sprawę, ale nadal trzeba pamiętać o normalizacji.
Na Windows jest od tego ustawienie systemowe i jest to zwykle Windows-1250 (jedno bajtowe kodowanie zawierające polskie znaki).
Pod Windows jest to o tyle skomplikowane, że w konsoli jest (przy polskich ustawieniach) kodowanie 852, a w oknach 1250.
Innego więc domyślnie wymaga kodowania printf
a innego np. MessageBoxA
.
Przykładowo, taki program:
#include <windows.h>
#include <stdio.h>
int main()
{
const char *napis = "Żółć";
printf(napis);
MessageBoxA(NULL, napis, "Test", 0);
}
zapisany w pliku zakodowanym w CP852 wygląda tak:
a zapisany w CP1250 wygląda tak:
W konsekwencji, plik źródłowy zapisany w jakimś edytorze w domyślnym kodowaniu (a będzie nim zwykle 1250) nie będzie prawidłowo wyświetlał polskich znaków w konsoli. Trzeba albo zmienić kodowanie w edytorze na 852, albo wykonywać dodatkową gimnastykę w samym kodzie źródłowym.