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.