2011-01-15 13 views
1

Der folgende Code druckt "nicht bestanden" zu trösten:Wrong codecvt Ergebnis in ViualStudio 2010

#include "stdafx.h" 
#include <locale> 
#include <memory> 
#include <string> 
#include <cstring> 
#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    typedef std::codecvt<wchar_t, char, mbstate_t> cvt; 

    // string to convert 
    const char cstr[] = "тест"; 
    size_t sz = std::strlen(cstr); 

    mbstate_t state; 
    const char *cnext; 
    wchar_t *wnext; 

    // buffer to write 
    wchar_t *buffer = new wchar_t[sz + 1]; 
    std::uninitialized_fill(buffer, buffer + sz + 1, 0); 

    // converting char* to wchar*, using locale 
    cvt::result res; 
    std::locale l(std::locale("Russian_Russia.1251")); 
    res = std::use_facet<cvt>(l).in(state, 
            cstr, cstr + sz, cnext, 
            buffer, buffer + sz + 1, wnext); 

    if(res == cvt::error) 
     std::wcout << L"failed" << std::endl; 
    else 
     std::wcout << buffer << std::wcout; 
    delete [] buffer; 
    return 0; 
} 

ich in Quellen sah und fand heraus, dass die Funktion in() schlägt fehl, weil Funktion _Mbrtowc (wmbtowc.c) zurückgibt -1:

 if (___mb_cur_max_l_func(locale) <= 1 || 
      (MultiByteToWideChar(codepage, 
           MB_PRECOMPOSED|MB_ERR_INVALID_CHARS, 
           (char *)pst, 
           2, 
           pwc, 
           (pwc) ? 1 : 0) == 0)) 
     { /* translation failed */ 
      *pst = 0; 
      errno = EILSEQ; 
      return -1; 
     } 

weil ___ mb_cur_max_l_func() (initctyp.c) gibt 1 für Russian_Russa.1251 locale. Was es bedeutet? Ich denke es ist nicht normal, dass Codecvt char * nicht in wchar_t * umwandeln kann.

Antwort

2
mbstate_t state; 

Sie haben vergessen, das zu initialisieren. Fix:

mbstate_t state = { 0 };