
James Raizew
Ich versuche, ein russisches “ф” (U+0444 Kyrillischer Kleinbuchstabe EF) Zeichen, das einen Dezimalcode erhält 1092. Wie kann ich dieses Zeichen mit C++ ausdrucken? Ich hätte gedacht, dass etwas in der Art des Folgenden funktionieren würde, aber …
int main (){
wchar_t f="1060";
cout << f << endl;
}

Namen53
Um den Charakter darzustellen, können Sie Universal Character Names (UCNs) verwenden. Das Zeichen ‘ф’ hat den Unicode-Wert U+0444 und in C++ könnte man es also ‘\u0444’ oder ‘\U00000444’ schreiben. Auch wenn die Quellcodecodierung dieses Zeichen unterstützt, können Sie es einfach wörtlich in Ihren Quellcode schreiben.
// 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
Das Drucken solcher Zeichen hängt davon ab, worauf Sie drucken. Wenn Sie an einen Unix-Terminalemulator drucken, der Terminalemulator eine Codierung verwendet, die dieses Zeichen unterstützt, und diese Codierung mit der Ausführungscodierung des Compilers übereinstimmt, können Sie Folgendes tun:
#include <iostream>
int main() {
std::cout << "Hello, ф or \u0444!\n";
}
Dieses Programm nicht erfordern, dass ‘ф’ in einem einzigen Zeichen dargestellt werden kann. Unter OS X und den meisten modernen Linux-Installationen funktioniert dies einwandfrei, da die Quell-, Ausführungs- und Konsolencodierungen alle UTF-8 sind (was alle Unicode-Zeichen unterstützt).
Bei Windows ist es schwieriger und es gibt verschiedene Möglichkeiten mit unterschiedlichen Kompromissen.
Wenn Sie keinen portablen Code benötigen (Sie werden wchar_t verwenden, was auf jeder anderen Plattform wirklich vermieden werden sollte), ist es wahrscheinlich das Beste, den Modus des Ausgabedatei-Handles so einzustellen, dass nur UTF-16-Daten verwendet werden.
#include <iostream>
#include <io.h>
#include <fcntl.h>
int main() {
_setmode(_fileno(stdout), _O_U16TEXT);
std::wcout << L"Hello, \u0444!\n";
}
Portabler Code ist schwieriger.
Beim Kompilieren mit -std=c++11
kann man einfach
const char *s = u8"\u0444";
cout << s << endl;
Letztendlich ist dies völlig plattformabhängig. Die Unicode-Unterstützung ist in Standard C++ leider sehr schlecht. Für GCC müssen Sie es zu einer schmalen Zeichenfolge machen, da sie UTF-8 verwenden und Windows eine breite Zeichenfolge möchte, und Sie müssen an ausgeben wcout
.
// GCC
std::cout << "ф";
// Windoze
wcout << L"ф";

Wladasimovic
Wenn Sie Windows verwenden (beachten Sie, dass wir printf() verwenden, nicht cout):
//Save As UTF8 without signature
#include <stdio.h>
#include<windows.h>
int main (){
SetConsoleOutputCP(65001);
printf("ф\n");
}
Nicht Unicode, aber funktioniert – 1251 statt UTF8:
//Save As Windows 1251
#include <iostream>
#include<windows.h>
using namespace std;
int main (){
SetConsoleOutputCP(1251);
cout << "ф" << endl;
}
Dieser Code funktioniert unter Linux (C++11, geany, g++ 7.4.0):
#include <iostream>
using namespace std;
int utf8_to_unicode(string utf8_code);
string unicode_to_utf8(int unicode);
int main()
{
cout << unicode_to_utf8(36) << '\t';
cout << unicode_to_utf8(162) << '\t';
cout << unicode_to_utf8(8364) << '\t';
cout << unicode_to_utf8(128578) << endl;
cout << unicode_to_utf8(0x24) << '\t';
cout << unicode_to_utf8(0xa2) << '\t';
cout << unicode_to_utf8(0x20ac) << '\t';
cout << unicode_to_utf8(0x1f642) << endl;
cout << utf8_to_unicode("$") << '\t';
cout << utf8_to_unicode("¢") << '\t';
cout << utf8_to_unicode("€") << '\t';
cout << utf8_to_unicode("🙂") << endl;
cout << utf8_to_unicode("\x24") << '\t';
cout << utf8_to_unicode("\xc2\xa2") << '\t';
cout << utf8_to_unicode("\xe2\x82\xac") << '\t';
cout << utf8_to_unicode("\xf0\x9f\x99\x82") << endl;
return 0;
}
int utf8_to_unicode(string utf8_code)
{
unsigned utf8_size = utf8_code.length();
int unicode = 0;
for (unsigned p=0; p<utf8_size; ++p)
{
int bit_count = (p? 6: 8 - utf8_size - (utf8_size == 1? 0: 1)),
shift = (p < utf8_size - 1? (6*(utf8_size - p - 1)): 0);
for (int k=0; k<bit_count; ++k)
unicode += ((utf8_code[p] & (1 << k)) << shift);
}
return unicode;
}
string unicode_to_utf8(int unicode)
{
string s;
if (unicode>=0 and unicode <= 0x7f) // 7F(16) = 127(10)
{
s = static_cast<char>(unicode);
return s;
}
else if (unicode <= 0x7ff) // 7FF(16) = 2047(10)
{
unsigned char c1 = 192, c2 = 128;
for (int k=0; k<11; ++k)
{
if (k < 6) c2 |= (unicode % 64) & (1 << k);
else c1 |= (unicode >> 6) & (1 << (k - 6));
}
s = c1; s += c2;
return s;
}
else if (unicode <= 0xffff) // FFFF(16) = 65535(10)
{
unsigned char c1 = 224, c2 = 128, c3 = 128;
for (int k=0; k<16; ++k)
{
if (k < 6) c3 |= (unicode % 64) & (1 << k);
else if (k < 12) c2 |= (unicode >> 6) & (1 << (k - 6));
else c1 |= (unicode >> 12) & (1 << (k - 12));
}
s = c1; s += c2; s += c3;
return s;
}
else if (unicode <= 0x1fffff) // 1FFFFF(16) = 2097151(10)
{
unsigned char c1 = 240, c2 = 128, c3 = 128, c4 = 128;
for (int k=0; k<21; ++k)
{
if (k < 6) c4 |= (unicode % 64) & (1 << k);
else if (k < 12) c3 |= (unicode >> 6) & (1 << (k - 6));
else if (k < 18) c2 |= (unicode >> 12) & (1 << (k - 12));
else c1 |= (unicode >> 18) & (1 << (k - 18));
}
s = c1; s += c2; s += c3; s += c4;
return s;
}
else if (unicode <= 0x3ffffff) // 3FFFFFF(16) = 67108863(10)
{
; // actually, there are no 5-bytes unicodes
}
else if (unicode <= 0x7fffffff) // 7FFFFFFF(16) = 2147483647(10)
{
; // actually, there are no 6-bytes unicodes
}
else ; // incorrect unicode (< 0 or > 2147483647)
return "";
}
Mehr:
'1060'
ist vier Zeichen und wird nicht unter dem Standard kompiliert. Sie sollten das Zeichen einfach als Zahl behandeln, wenn Ihre Breitzeichen 1:1 mit Unicode übereinstimmen (überprüfen Sie Ihre Gebietsschemaeinstellungen).
int main (){
wchar_t f = 1060;
wcout << f << endl;
}

MGR
Ich musste die Zeichenfolge in der Benutzeroberfläche anzeigen und in einer XML-Konfigurationsdatei speichern. Das oben angegebene Format ist gut für Strings in C++, ich möchte hinzufügen, dass wir die xml-kompatible Zeichenfolge für das Sonderzeichen haben können, indem wir “\u” durch “&#x” ersetzen und ein “;” hinzufügen. Am Ende.
Zum Beispiel: C++ : “\u0444” –> XML : "ф"
9896000cookie-checkWie drucke ich Unicode-Zeichen in C++?yes
Beachten Sie, dass das Problem zweierlei ist (zumindest wenn es um ein gültiges C++-Programm geht): das Zeichen im Code ausdrücken und es korrekt an übergeben
std::cout
. (Und selbst wenn diese beiden Schritte korrekt ausgeführt werden, ist es eine ganz andere Sache, das Zeichen in was auch immer korrekt anzuzeigenstd::cout
ist verbunden mit.)– Luc Danton
18. August 2012 um 4:46 Uhr
Beantwortet das deine Frage? Unicode-Codierung für Zeichenfolgenliterale in C++11
– MJ Rayburn
24. Juni 2021 um 2:33 Uhr