| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 
 |  
std::wstring widen(std::string const& s, std::locale loc = std::locale())
{
    std::char_traits<wchar_t>::state_type state = { 0 };
 
    typedef std::codecvt<wchar_t, char, std::char_traits<wchar_t>::state_type >
        ConverterFacet;
 
    ConverterFacet const& converter(std::use_facet<ConverterFacet>(loc));
 
    char const* nextToRead = s.data();
    wchar_t buffer[BUFSIZ];
    wchar_t* nextToWrite;
    std::codecvt_base::result result;
    std::wstring wresult;
 
    while ((result
            = converter.in
                  (state,
                   nextToRead, s.data()+s.size(), nextToRead,
                   buffer, buffer+sizeof(buffer)/sizeof(*buffer), nextToWrite))
           == std::codecvt_base::partial)
    {
        wresult.append(buffer, nextToWrite);
    }
 
    if (result == std::codecvt_base::error) {
        throw std::runtime_error("Encoding error");
    }
    wresult.append(buffer, nextToWrite);
    return wresult;
}
 
std::string narrow(std::wstring const& s, std::locale loc = std::locale())
{
    std::char_traits<wchar_t>::state_type state = { 0 };
 
    typedef std::codecvt<char, wchar_t, std::char_traits<wchar_t>::state_type >
        ConverterFacet;
 
    ConverterFacet const& converter(std::use_facet<ConverterFacet>(loc));
 
    wchar_t const* nextToRead = s.data();
    char buffer[BUFSIZ];
    char* nextToWrite;
    std::codecvt_base::result result;
    std::string sresult;
 
    while ((result
            = converter.in
                  (state,
                   nextToRead, s.data()+s.size(), nextToRead,
                   buffer, buffer+sizeof(buffer)/sizeof(*buffer), nextToWrite))
           == std::codecvt_base::partial)
    {
        sresult.append(buffer, nextToWrite);
    }
 
    if (result == std::codecvt_base::error) {
        throw std::runtime_error("Encoding error");
    }
    sresult.append(buffer, nextToWrite);
    return sresult;
} | 
Partager