c++ - Why is wstring_convert throwing a range_error? -


i'm writing code needs convert between byte strings , wide strings, using system locale. when reading file, incredibly easy do. can use std::wifstream, imbue std::locale(""), , use std::getline.

according cppreference's codecvt page, wifstream uses codecvt<wchar_t, char, mbstate_t>, thought might able convert between std::string , std::wstring using well:

// utility wrapper adapt locale-bound facets wstring/wbuffer convert template<class facet> struct deletable_facet : facet {     template<class ...args>     deletable_facet(args&& ...args) : facet(std::forward<args>(args)...) {}     ~deletable_facet() {} };  std::locale::global(std::locale("")); std::wstring_convert<     deletable_facet<std::codecvt<wchar_t, char, std::mbstate_t>>> wconv; std::wstring wstr = wconv.from_bytes(data); 

however, when try run this, range_error thrown wstring_convert. did googling around, , apparently happens when wstring_convert fails convert string.

however, these strings able converted using wfstream, should using same codecvt using wstring_convert. why wifstream work, wstring_convert not?

and there way can convert between strings , wstrings using system's locale?

a full example of problem, adapted codecvt page, here, , output is:

sizeof(char32_t) = 4 sizeof(wchar_t)  = 4 utf-8 file contains following ucs4 code points:  u+007a u+00df u+6c34 u+1f34c utf-8 string contains following ucs4 code points:  u+007a u+00df u+6c34 u+1f34c terminate called after throwing instance of 'std::range_error'   what():  wstring_convert aborted (core dumped) 

yourwifstream , wstring_convert using different facets.

wifstream using locale-dependent conversion facet; pulls out of std::locale(""), imbued, via std::use_facet

wstring_convert given locale-independent, standalone codecvt facet, , 1 provided implementation apparently not convert utf-8 fitting; try calling in on directly see does.

an easy way locale-dependent facet ask name, in std::codecvt_byname


Comments

Popular posts from this blog

angularjs - ADAL JS Angular- WebAPI add a new role claim to the token -

php - CakePHP HttpSockets send array of paramms -

node.js - Using Node without global install -