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