GNU/Linux >> Belajar Linux >  >> Linux

Mengapa wprintf mentransliterasi teks Rusia di Unicode ke bahasa Latin di Linux?

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.


Linux
  1. Apa itu POSIX? Mengapa Penting bagi Pengguna Linux/UNIX?

  2. Linux – Mengapa Linux Mengizinkan 'init=/bin/bash'?

  3. Linux – Mengapa Setuid Tidak Bekerja??

  1. Linux – Mengapa Es_mx Lokal Bekerja Tapi Tidak Es?

  2. Linux – Mengapa Rsync Di Linux Tidak Mempertahankan Semua Stempel Waktu (Waktu Pembuatan)?

  3. Mengapa rand() mengulang angka jauh lebih sering di Linux daripada Mac?

  1. Mengapa Windows tidak mengenali file di dalam partisi Linux?

  2. Mengapa dentang menghasilkan teks yang tidak dapat dipahami saat dialihkan?

  3. Mengapa regex ini tidak berfungsi di linux?