GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi wprintf translittère-t-il le texte russe en Unicode en latin sous Linux ?

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.


Linux
  1. Pourquoi Ctrl + V ne colle-t-il pas dans Bash (shell Linux) ?

  2. Pourquoi mon système Linux bégaie-t-il à moins que je ne supprime continuellement les caches ?

  3. Pourquoi cette regex ne fonctionne-t-elle pas sous Linux ?

  4. Pourquoi Linux chauffe-t-il mon ordinateur ?

  5. Pourquoi le trafic réseau Linux ne passe-t-il que par eth0 ?

Linux – Pourquoi Linux autorise-t-il « init=/bin/bash » ?

Linux - Pourquoi Setuid ne fonctionne-t-il pas ??

Linux – Pourquoi la locale Es_mx fonctionne-t-elle mais pas Es ?

Linux – Pourquoi faut-il autant de temps pour détecter une clé USB ?

Linux - Pourquoi Rsync sur Linux ne conserve pas tous les horodatages (heure de création) ?

Qu'est-ce que la commande Grep sous Linux ? Pourquoi est-il utilisé et comment fonctionne-t-il ?