Например:
std::string result(len + 1, '\0');
int retLen = ::WideCharToMultiByte(CP_UTF8, 0, str.c_str(), str.size(), &result[0], len + 1, NULL, NULL);
if (!(retLen && retLen == len && SUCCEEDED(::GetLastError())))
return std::string();
result.resize(retLen);
return result;
Так можно? Или только вектор?
Здравствуйте, sanx, Вы писали:
S>Например:
S>S> std::string result(len + 1, '\0');
S> int retLen = ::WideCharToMultiByte(CP_UTF8, 0, str.c_str(), str.size(), &result[0], len + 1, NULL, NULL);
S> if (!(retLen && retLen == len && SUCCEEDED(::GetLastError())))
S> return std::string();
S> result.resize(retLen);
S> return result;
S>
S>Так можно? Или только вектор?
в теории — можно, начиная с С++11
на практике можно было и в С++03, но не во всех компиляторах
Здравствуйте, sanx, Вы писали:
S>S> std::string result(len + 1, '\0');
S> int retLen = ::WideCharToMultiByte(CP_UTF8, 0, str.c_str(), str.size(), &result[0], len + 1, NULL, NULL);
S> if (!(retLen && retLen == len && SUCCEEDED(::GetLastError())))
S> return std::string();
S> result.resize(retLen);
S> return result;
S>
1. Что такое
SUCCEEDED(::GetLastError())
?
2. Почему такое требование
retLen == len
?
Для CP_UTF8 это будет верно только для английского текста.
3.
std::string result(len + 1, '\0');
Выделяет буфер и заполняет его нулями.
Зачем заполнять нулями, если затем туда пишется текст?
Здравствуйте, rus blood, Вы писали:
RB>3. std::string result(len + 1, '\0');
RB>Выделяет буфер и заполняет его нулями.
RB>Зачем заполнять нулями, если затем туда пишется текст?
Наверное, чтобы не писать в две строки:
std::string s; s.resize(len+1);
Здравствуйте, rus blood, Вы писали:
S>>S>> std::string result(len + 1, '\0');
S>> int retLen = ::WideCharToMultiByte(CP_UTF8, 0, str.c_str(), str.size(), &result[0], len + 1, NULL, NULL);
S>> if (!(retLen && retLen == len && SUCCEEDED(::GetLastError())))
S>> return std::string();
S>> result.resize(retLen);
S>> return result;
S>>
RB>1. Что такое SUCCEEDED(::GetLastError())
?
видимо это проверка на ERROR_NO_UNICODE_TRANSLATION
RB>2. Почему такое требование retLen == len
?
RB>Для CP_UTF8 это будет верно только для английского текста.
не только.
Здравствуйте, B0FEE664, Вы писали:
RB>>1. Что такое SUCCEEDED(::GetLastError())
?
BFE>видимо это проверка на ERROR_NO_UNICODE_TRANSLATION
Это кривизна, основанная на том, что WinAPI ошибки и ошибки COM используют 0 для обозначения результата "всё хорошо/нет ошибки". Так делать не следует.