<ブロック引用>
Linux
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 シーケンスに変換できます。