pourquoi translittère-t-il le texte russe en Unicode en latin au lieu de le transcoder en UTF-8 ou d'utiliser des caractères de remplacement ?
Comme la locale de départ de votre programme est celle par défaut, le C
lieu. Il traduit donc une chaîne large en C
lieu. C
locale ne gère pas UTF-8 ni aucun unicode, donc votre bibliothèque standard fait de son mieux pour traduire les caractères larges en un jeu de caractères de base utilisé dans C
locale.
Vous pouvez changer les paramètres régionaux en tout Les paramètres régionaux UTF-8 et le programme doivent générer une chaîne UTF-8.
Remarque :(dans l'implémentation que je connais) l'encodage du FILE
le flux est déterminé et enregistré à ce moment l'orientation du flux (large vs normal) est choisie. N'oubliez pas de définir les paramètres régionaux avant faire n'importe quoi avec stdout
(c'est-à-dire ceci contre ceci).
Parce que la conversion des caractères larges est effectuée en fonction des paramètres régionaux actuellement définis. Par défaut, un programme C démarre toujours avec une locale "C" qui ne prend en charge que les caractères ASCII.
Vous devez d'abord passer à n'importe quel paramètre régional russe ou UTF-8 :
setlocale(LC_ALL, "ru_RU.utf8"); // Russian Unicode
setlocale(LC_ALL, "en_US.utf8"); // English US Unicode
Ou vers un paramètre régional actuel du système (ce qui est probablement ce dont vous avez besoin) :
setlocale(LC_ALL, "");
Le programme complet sera :
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main() {
setlocale(LC_ALL, "ru_RU.utf8");
wprintf(L"Привет, мир!\n");
}
Quant à votre code fonctionnant tel quel sur d'autres machines, cela est dû à la façon dont libc y fonctionne. Certaines implémentations (comme musl) ne prennent pas en charge les paramètres régionaux non Unicode et peuvent donc traduire sans condition les caractères larges en une séquence UTF-8.