Poniższy kod pokazuje nieoczekiwane zachowanie na moim komputerze (testowane z Visual C++ 2008 SP1 w systemie Windows XP i VS 2012 na Windows 7):UTF-8 wyjście na konsoli systemu Windows
#include <iostream>
#include "Windows.h"
int main() {
SetConsoleOutputCP(CP_UTF8);
std::cout << "\xc3\xbc";
int fail = std::cout.fail() ? '1': '0';
fputc(fail, stdout);
fputs("\xc3\xbc", stdout);
}
po prostu skompilowany z cl /EHsc test.cpp
.
Windows XP: Wyjście w oknie konsoli jest ü0ü
(tłumaczona na stronę kodową 1252, pierwotnie pokazuje pewne rysowanie linii charachters w domyślnej strony kodowej, chyba 437). Kiedy zmienić ustawienia okna konsoli, aby użyć „Lucida Console” zestaw znaków i ponownie uruchomić mój test.exe, wyjście zmienia się na 1ü
, co oznacza
- postać
ü
mogą być zapisywane za pomocąfputs
i jego kodowanie UTF-8C3 BC
std::cout
nie działa z jakiegoś powodu- strumieni
failbit
wyznacza po próbuje pisać postać
Windows 7: Wyjście przy użyciu konsoli Consolas to ��0ü
. Jeszcze bardziej interesujące. Prawidłowe bajty są zapisywane prawdopodobnie (przynajmniej podczas przekierowywania wyjścia do pliku), a stan strumienia jest w porządku, ale dwa bajty są zapisywane jako oddzielne znaki).
Próbowałem poruszyć ten problem w "Microsoft Connect" (patrz here), , ale MS nie było bardzo pomocne. Równie dobrze możesz wyglądać here jak już wcześniej zadawano coś podobnego.
Czy możesz odtworzyć ten problem?
Co robię źle? Czy znaki std::cout
i fputs
nie powinny mieć tego samego efektu?
rozwiązany: (w pewnym sensie) Po idei mike.dld za I wdrożone std::stringbuf
robi konwersję z UTF-8 dla Windows-1252 w sync()
i zastąpił streambuf z std::cout
z tego konwertera (patrz mój komentarz na mikrofonie. odpowiedź dld).
Miałem problemy z wersją C++ Iostreams. jest dużo ukrytej złośliwości, która powoduje problemy. nie jest to warte odpowiedzi, ale kiedy iostreams sprawia ci kłopot, użyj stdio c, musiałem już wiele razy z takimi właśnie problemami. –
Tak, używanie iostreams jest bardziej skomplikowane niż stdio, istnieją nawet [pełne teksty] (http://www.amazon.com/Standard-Iostreams-Locales-Programmers-Reference/dp/0201183951) na ten temat. Ale iostreams daje dużą elastyczność, z której korzystam chętnie. – mkluwe
Czy to nie problem z konsolą systemu Windows? Pamiętam, że nie jest on w żaden sposób znany z Unicode, tworząc wiele takich problemów ... –