GNU/Linux >> Znalost Linux >  >> Linux

Proč wprintf v Linuxu přepisuje ruský text v Unicode do latinky?

proč přepisuje ruský text v Unicode do latinky na rozdíl od překódování do UTF-8 nebo pomocí náhradních znaků?

Protože výchozí národní prostředí vašeho programu je výchozí, C národní prostředí. Jde tedy o překlad širokého řetězce do C národní prostředí. C locale nezpracovává UTF-8 ani žádné unicode, takže vaše standardní knihovna nejlépe přeloží široké znaky do nějaké základní znakové sady používané v C národní prostředí.

Můžete změnit národní prostředí na libovolné UTF-8 locale a program by měl vypsat řetězec UTF-8.

Poznámka:(v implementaci, kterou znám) kódování FILE stream je určen a v daný čas uložen je zvolena orientace proudu (široký vs. normální). Nezapomeňte nastavit národní prostředí před dělat cokoli s stdout (tj. toto vs toto).


Protože převod širokých znaků se provádí podle aktuálně nastaveného národního prostředí. Ve výchozím nastavení program v jazyce C vždy začíná národním prostředím "C", které podporuje pouze znaky ASCII.

Nejprve musíte přepnout na jakékoli ruské nebo UTF-8 národní prostředí:

setlocale(LC_ALL, "ru_RU.utf8"); // Russian Unicode
setlocale(LC_ALL, "en_US.utf8"); // English US Unicode

Nebo do aktuálního národního prostředí systému (což je pravděpodobně to, co potřebujete):

setlocale(LC_ALL, "");

Kompletní program bude:

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main() {
  setlocale(LC_ALL, "ru_RU.utf8");
  wprintf(L"Привет, мир!\n");
}

Pokud jde o váš kód fungující tak, jak je na jiných strojích, je to kvůli tomu, jak tam funguje knihovna libc. Některé implementace (jako musl) nepodporují národní prostředí, která nejsou Unicode, a proto mohou bezpodmínečně překládat široké znaky do sekvence UTF-8.


Linux
  1. Proč preprocesor C interpretuje slovo linux jako konstantu 1?

  2. Proč rand() opakuje čísla mnohem častěji na Linuxu než na Macu?

  3. Proč systém Windows nerozpozná soubory uvnitř oddílů Linux?

  1. Proč clang při přesměrování generuje nesrozumitelný text?

  2. Proč se můj systém Linux zasekává, pokud neustále nezahazuji mezipaměti?

  3. Proč tento regulární výraz nefunguje na linuxu?

  1. Proč jsem přešel z Macu na Linux

  2. Proč Linux zahřívá můj počítač?

  3. Proč síťový provoz Linuxu prochází pouze přes eth0?