perché traslittera il testo russo in Unicode in latino anziché transcodificarlo in UTF-8 o utilizzare caratteri sostitutivi?
Perché il locale iniziale del tuo programma è quello predefinito, il C
locale. Quindi sta traducendo una stringa larga in C
locale. C
locale non gestisce UTF-8 né Unicode, quindi la tua libreria standard fa meglio a tradurre i caratteri larghi in alcuni set di caratteri di base usati in C
locale.
Puoi modificare le impostazioni internazionali in qualsiasi Locale UTF-8 e il programma dovrebbe generare una stringa UTF-8.
Nota:(nell'implementazione che conosco) la codifica del FILE
lo stream viene determinato e salvato al momento viene scelto l'orientamento del flusso (ampio o normale). Ricordati di impostare la lingua prima fare qualsiasi cosa con stdout
(es. questo contro questo).
Perché la conversione di caratteri estesi viene eseguita in base alla locale attualmente impostata. Per impostazione predefinita, un programma C inizia sempre con una locale "C" che supporta solo caratteri ASCII.
Devi prima passare a qualsiasi lingua russa o UTF-8:
setlocale(LC_ALL, "ru_RU.utf8"); // Russian Unicode
setlocale(LC_ALL, "en_US.utf8"); // English US Unicode
O a un'impostazione locale del sistema corrente (che è probabilmente ciò di cui hai bisogno):
setlocale(LC_ALL, "");
Il programma completo sarà:
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main() {
setlocale(LC_ALL, "ru_RU.utf8");
wprintf(L"Привет, мир!\n");
}
Per quanto riguarda il tuo codice che funziona così com'è su altre macchine, ciò è dovuto al modo in cui libc opera lì. Alcune implementazioni (come musl) non supportano localizzazioni non Unicode e quindi possono tradurre incondizionatamente caratteri estesi in una sequenza UTF-8.