Неправильный результат codecvt в ViualStudio 2010 - PullRequest
1 голос
/ 15 января 2011

Следующий код выводит «не удалось» на консоль:

#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;
}

Я изучил источники и обнаружил, что функция в () не работает, потому что функция _Mbrtowc (wmbtowc.c) возвращает -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;
        }

потому что ___ mb_cur_max_l_func () (initctyp.c) возвращает 1 для локали Russian_Russa.1251. Что это означает? Я думаю, что это не нормально, что codecvt не может конвертировать char * в wchar_t *.

1 Ответ

2 голосов
/ 15 января 2011
 mbstate_t state;

Вы забыли инициализировать это. Исправлено:

 mbstate_t state = { 0 };
...