75

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

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

11 に答える 11

72

文字を表すために、ユニバーサル文字名(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";
}

このプログラムでは、「ф」を1つの文字で表すことができる必要はありません。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";
}

ポータブルコードはもっと難しいです。

于 2012-08-18T04:42:52.577 に答える
17

でコンパイルすると-std=c++11、簡単に

  const char *s  = u8"\u0444";
  cout << s << endl;
于 2012-08-18T16:19:28.787 に答える
12

最終的に、これは完全にプラットフォームに依存します。Unicodeサポートは、残念ながら、標準C++では非常に貧弱です。GCCの場合、UTF-8を使用し、Windowsは幅の広い文字列を必要とし、に出力する必要があるため、幅の狭い文字列にする必要がありますwcout

// GCC
std::cout << "ф";
// Windoze
wcout << L"ф";
于 2012-08-18T03:26:49.620 に答える
8

Windows を使用している場合 (cout ではなく、printf() を使用していることに注意してください):

//Save As UTF8 without signature
#include <stdio.h>
#include<windows.h>
int main (){
    SetConsoleOutputCP(65001); 
    printf("ф\n");
}

Unicode ではありませんが動作しています - UTF8 の代わりに 1251:

//Save As Windows 1251
#include <iostream>
#include<windows.h>
using namespace std;
int main (){
    SetConsoleOutputCP(1251); 
    cout << "ф" << endl;
}
于 2013-09-28T18:07:25.887 に答える
3

'1060'は4文字で、標準ではコンパイルされません。ワイド文字がUnicodeと1:1で一致する場合は、文字を数字として扱う必要があります(ロケール設定を確認してください)。

int main (){
    wchar_t f = 1060;
    wcout << f << endl;
}
于 2012-08-18T03:28:15.963 に答える
0

Linuxでは、次のことができます:

std::cout << "ф";

ここから文字をコピーして貼り付けただけで、少なくとも試したランダムサンプルでは失敗しませんでした.

于 2017-01-09T10:59:26.737 に答える