GNU/Linux >> Linux の 問題 >  >> Linux

Linux で wprintf が Unicode のロシア語テキストをラテン語に音訳するのはなぜですか?

<ブロック引用>

Unicode のロシア語テキストを、UTF-8 にコード変換したり置換文字を使用したりするのではなく、ラテン語に音訳するのはなぜですか?

プログラムの開始ロケールはデフォルトのロケールであるため、 C ロケール。つまり、ワイド文字列を C に変換しています ロケール。 C ロケールは UTF-8 も Unicode も処理しないため、標準ライブラリはワイド文字を C で使用される基本的な文字セットに変換するのが最善です

ロケールを 任意の に変更できます UTF-8 ロケールとプログラムは UTF-8 文字列を出力する必要があります。

注:(私が知っている実装では) FILE のエンコーディング ストリームが決定され、その時点で保存 ストリームの向き (ワイドとノーマル) が選択されます。 にロケールを設定することを忘れないでください stdout で何でもする (つまり、これとこれ)


ワイド文字の変換は、現在設定されているロケールに従って行われるためです。デフォルトでは、C プログラムは常に、ASCII 文字のみをサポートする "C" ロケールで開始されます。

最初にロシア語または UTF-8 ロケールに切り替える必要があります:

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

または、現在のシステム ロケール (おそらくこれが必要です):

setlocale(LC_ALL, "");

完全なプログラムは次のとおりです:

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

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

あなたのコードが他のマシンでそのまま動作している場合、これは libc がそこでどのように動作するかによるものです。一部の実装 (musl など) は非 Unicode ロケールをサポートしていないため、無条件にワイド文字を UTF-8 シーケンスに変換できます。


Linux
  1. C プリプロセッサが linux という単語を定数 1 と解釈するのはなぜですか?

  2. rand() が Mac よりも Linux でより頻繁に数値を繰り返すのはなぜですか?

  3. Windows が Linux パーティション内のファイルを認識しないのはなぜですか?

  1. リダイレクト時にclangが理解できないテキストを生成するのはなぜですか?

  2. この正規表現が Linux で機能しないのはなぜですか?

  3. Linux がコンピューターを熱くするのはなぜですか?

  1. MacからLinuxに切り替えた理由

  2. Linuxサーバーとは何ですか?なぜあなたのビジネスにはLinuxサーバーが必要なのですか?

  3. Linux – USBスティックの検出に時間がかかるのはなぜですか?