Dlaczegocout << "привет"; lub wcout << L "привет";
cout<< "привет";
działa dobrze while
wcout<< L"привет";
nie? (w Qt Creator dla systemu Linux)
Dlaczegocout << "привет"; lub wcout << L "привет";
cout<< "привет";
działa dobrze while
wcout<< L"привет";
nie? (w Qt Creator dla systemu Linux)
Domyślnie GCC i Clang traktują plik źródłowy jako UTF-8. Twój terminal Linux jest prawdopodobnie również skonfigurowany do UTF-8. Tak więc z cout<< "привет"
jest ciąg znaków UTF-8, który jest wydrukowany w terminalu UTF-8, wszystko jest dobrze.
wcout<< L"привет"
zależy od prawidłowej konfiguracji Locale w celu konwersji szerokich znaków w kodowanie znaków terminala. Aby proces konwersji zadziałał, należy zainicjować ustawienia regionalne (default "classic" aka "C" locale nie wie, jak konwertować szerokie znaki). Użyj opcji std::locale::global (std::locale (""))
, aby Ustawienia regionalne były zgodne z konfiguracją środowiska lub std::locale::global (std::locale ("en_US.UTF-8"))
, aby używać określonego ustawienia narodowego (similar to this C example).
Oto pełna źródłowy programu roboczego:
#include <iostream>
#include <locale>
using namespace std;
int main() {
std::locale::global (std::locale ("en_US.UTF-8"));
wcout << L"привет\n";
}
Z g++ test.cc && ./a.out
ten drukuje "Ďđčâĺň" (na Debianie Jessie).
Zobacz także this answer o zagrożeniach związanych z używaniem szerokich znaków ze standardowym wyjściem.
Powodem jest zgodność ze standardami C, C++ i POSIX. – AProgrammer
dzięki. jednak zaskakujące jest to, że "привет" nie jest std dosłowny, to powinno być 'char []'. – user2029077
@MinimusHeximus: "привет" jest char [] w UTF-8 domyślnie, L "привет", jednak jest wchar [] w UTF-16, UTF-32 lub UCS-2. – ArtemGr
Prawdopodobnie, ponieważ cokolwiek otrzymuje te znaki jako wynik "nie rozumie szerokich znaków". Jeśli opisujesz "Nie działa" trochę więcej, może ci to pomóc. –
to drukuje ???? zamiast tego w oknie terminala. Jak jednak "привет" może być unicode? – user2029077
и тебе "привет" – vladkras