为什么vs2015中的ctye<>()加宽返回0xffff

时间:2015-12-22 16:37:19

标签: c++

std::locale loc("German_germany");
std::locale::global(loc);

std::string s = "nj \xa2 + \x80 1\n";

std::cout << "string:"<<s ;

std::wstring ws = to_wstring(s, std::locale("German_germany"));

并且to_wstring是

std::wstring to_wstring (const std::string& str,
                     const std::locale& loc = std::locale()){
    std::vector<wchar_t> buf(str.size());
    std::use_facet<std::ctype<wchar_t>>(loc).widen(str.data(),
                                                  str.data()+str.size(),
                                                  buf.data());
return std::wstring(buf.data(),buf.size());
}

当cout s时,输出为

  

string:nj¢+€1

这就是我想要的。 但是当程序在其中执行to_wstring,ctype&lt;&gt;()。widen()时,事情会变为错误。 ¢加宽到0xffff。 令人惊讶的是,€的加宽输出是正确的。它从0x80(8位窗口编码)变为0x20ac(UTF16 / USC2编码) 为什么呢?

我在C ++标准库,第二版,第三版中找到了这个例子。在原始例子中,\ xa2代替\ xe4。该字母不能从字符串s cout,也扩展到0xffff。

0 个答案:

没有答案