mengapa ini mentransliterasi teks Rusia dalam Unicode ke Latin, bukan mentranskodekannya ke UTF-8 atau menggunakan karakter pengganti?
Karena lokal awal program Anda adalah yang default, C
lokal. Jadi itu menerjemahkan string lebar menjadi C
lokal. C
locale tidak menangani UTF-8 atau unicode apa pun, jadi perpustakaan standar Anda melakukan yang terbaik untuk menerjemahkan karakter lebar ke dalam kumpulan karakter dasar yang digunakan dalam C
lokal.
Anda dapat mengubah lokal menjadi apa saja Lokal UTF-8 dan program harus menampilkan string UTF-8.
Catatan:(dalam implementasi saya tahu) pengkodean FILE
streaming ditentukan dan disimpan pada saat itu orientasi aliran (lebar vs normal) dipilih. Ingatlah untuk menyetel lokal sebelum melakukan apa saja dengan stdout
(mis. ini vs ini).
Karena konversi karakter lebar dilakukan sesuai dengan lokal yang ditetapkan saat ini. Secara default, program C selalu dimulai dengan lokal "C" yang hanya mendukung karakter ASCII.
Anda harus beralih ke lokal Rusia atau UTF-8 terlebih dahulu:
setlocale(LC_ALL, "ru_RU.utf8"); // Russian Unicode
setlocale(LC_ALL, "en_US.utf8"); // English US Unicode
Atau ke lokal sistem saat ini (yang mungkin Anda butuhkan):
setlocale(LC_ALL, "");
Program lengkapnya adalah:
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main() {
setlocale(LC_ALL, "ru_RU.utf8");
wprintf(L"Привет, мир!\n");
}
Adapun kode Anda berfungsi apa adanya di mesin lain - ini karena cara libc beroperasi di sana. Beberapa implementasi (seperti musl) tidak mendukung lokal non-Unicode sehingga dapat menerjemahkan karakter lebar tanpa syarat ke urutan UTF-8.