GNU/Linux >> Linux Esercitazione >  >> Linux

Perché wprintf traslittera il testo russo in Unicode in latino su Linux?

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.


Linux
  1. Linux:perché Locale Es_mx funziona ma non Es?

  2. Perché il preprocessore C interpreta la parola linux come la costante 1?

  3. Perché rand() ripete i numeri molto più spesso su Linux che su Mac?

  4. Perché Windows non riconosce i file all'interno delle partizioni Linux?

  5. Perché clang genera testo incomprensibile quando viene reindirizzato?

Linux:perché Rsync su Linux non conserva tutti i timestamp (ora di creazione)?

Che cos'è il comando Grep in Linux? Perché viene utilizzato e come funziona?

Perché Ctrl + V non incolla in Bash (shell Linux)?

Perché il mio sistema Linux balbetta a meno che non elimini continuamente le cache?

Perché questa espressione regolare non funziona su Linux?

Perché il traffico di rete Linux passa solo attraverso eth0?