1. ホーム
  2. c++

C++でUnicodeの文字を表示するには?

2023-10-18 11:07:36

質問

ロシア語の"ф"を印刷しようとしています( U+0444 CYRILLIC SMALL LETTER EF) の文字を印字しようとしているのですが、これは10進数のコードで 1092 . C++を使って、この文字をプリントアウトするにはどうしたらよいでしょうか?私は次のようなものがうまくいくと思ったのですが、まだ...。

int main (){
   wchar_t f = '1060';
   cout << f << endl;
}

どのように解決するのですか?

文字を表現するには、Universal Character Names (UCN)を使用することができます。文字'ф'はUnicode値U+0444なので、C++では' \u0444' または ' \U00000444' と記述することができます。また、ソースコードのエンコーディングがこの文字をサポートしている場合は、ソースコードにそのまま記述することができます。

// both of these assume that the character can be represented with
// a single char in the execution encoding
char b = '\u0444';
char a = 'ф'; // this line additionally assumes that the source character encoding supports this character

このような文字をプリントアウトすることは、何をプリントアウトするかによります。もしあなたがUnixのターミナルエミュレータにプリントしていて、ターミナルエミュレータがこの文字をサポートするエンコーディングを使用していて、そのエンコーディングがコンパイラの実行エンコーディングと一致するならば、次のようにすることができます。

#include <iostream>

int main() {
    std::cout << "Hello, ф or \u0444!\n";
}

このプログラム ではありません。 は 'ф' が一文字で表現できることを必要としません。OS X や最近の Linux では、ソース、実行、コンソールのエンコーディングがすべて UTF-8 (すべての Unicode 文字をサポート) であるため、これは問題なく動作します。

Windows では物事が難しく、異なるトレードオフで異なる可能性があります。

移植可能なコードを必要としない場合 (他のすべてのプラットフォームで本当に避けるべき wchar_t を使用することになります)、おそらく最も良い方法は、出力ファイル ハンドルのモードを UTF-16 データのみを受け取るように設定することです。

#include <iostream>
#include <io.h>
#include <fcntl.h>

int main() {
    _setmode(_fileno(stdout), _O_U16TEXT);
    std::wcout << L"Hello, \u0444!\n";
}

ポータブルなコードはより困難です。