Пытаясь заставить libc++ и его тесты работать в Windows, я столкнулся с проблемой, которую никак не могу понять. Следующий код взят из тестового кода libc++ и проходит на Mac (и, возможно, FreeBSD), но не с MinGW-w64 и MSVC 2010 SP1.
#include <iomanip>
#include <iostream>
#include <cassert>
template <class CharT>
struct testbuf
: public std::basic_streambuf<CharT>
{
typedef std::basic_string<CharT> string_type;
typedef std::basic_streambuf<CharT> base;
private:
string_type str_;
public:
testbuf() {}
testbuf(const string_type& str)
: str_(str)
{
base::setg(const_cast<CharT*>(str_.data()),
const_cast<CharT*>(str_.data()),
const_cast<CharT*>(str_.data()) + str_.size());
}
};
#if _WIN32
#define LOCALE_en_US_UTF_8 "English_USA.1252"
#else
#define LOCALE_en_US_UTF_8 "en_US.UTF-8"
#endif
int main()
{
testbuf<char> sb(" Sat Dec 31 23:55:59 2061");
std::istream is(&sb);
is.imbue(std::locale(LOCALE_en_US_UTF_8));
std::tm t = {0};
is >> std::get_time(&t, "%c");
std::cout << t.tm_sec << "\n";
std::cout << t.tm_min << "\n";
std::cout << t.tm_hour << "\n";
std::cout << t.tm_mday << "\n";
std::cout << t.tm_mon << "\n";
std::cout << t.tm_year << "\n";
std::cout << t.tm_wday << "\n";
assert(t.tm_sec == 59);
assert(t.tm_min == 55);
assert(t.tm_hour == 23);
assert(t.tm_mday == 31);
assert(t.tm_mon == 11);
assert(t.tm_year == 161);
assert(t.tm_wday == 6);
}
Тест пройден для Mac/FreeBSD, но все разные элементы равны 0 для Windows. Это верно для MinGW-w64+libc++ и MSVC10+Microsoft STL.
Это просто дерьмовая поддержка локали в Windows или здесь действует неправильное предположение, зависящее от реализации (формат ввода), которое я могу исправить или обойти?
UTF_8
. Особенно для простого английского (en_US) этот простой пример должен работать.istream::imbue
не выходит из строя. Я убедился в этом. - person rubenvb   schedule 02.10.2011