ロシア語の「ф」( U + 0444 CYRILLIC SMALL LETTER EF)文字を印刷しようとしています。これには、10進数の1092のコードが与えられています。C ++を使用して、この文字を印刷するにはどうすればよいですか?私は次のようなものがうまくいくと思っていたでしょうが...
int main (){
wchar_t f = '1060';
cout << f << endl;
}
文字を表すために、ユニバーサル文字名(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";
}
ポータブルコードはもっと難しいです。
でコンパイルすると-std=c++11
、簡単に
const char *s = u8"\u0444";
cout << s << endl;
最終的に、これは完全にプラットフォームに依存します。Unicodeサポートは、残念ながら、標準C++では非常に貧弱です。GCCの場合、UTF-8を使用し、Windowsは幅の広い文字列を必要とし、に出力する必要があるため、幅の狭い文字列にする必要がありますwcout
。
// GCC
std::cout << "ф";
// Windoze
wcout << L"ф";
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;
}
'1060'
は4文字で、標準ではコンパイルされません。ワイド文字がUnicodeと1:1で一致する場合は、文字を数字として扱う必要があります(ロケール設定を確認してください)。
int main (){
wchar_t f = 1060;
wcout << f << endl;
}