Как мне сказать wstring, что строка, которую я подаю, это уже wstring? - PullRequest
3 голосов
/ 26 марта 2011

Я использую std :: string в качестве текстового буфера.Тогда я уверен, что данные, содержащиеся в этом буфере, - это UTF-16 (то есть это действительно std :: wstring). Как я могу привести std :: string в std :: wstring? Std :: string является неправильным, данные действительно являются wstring.

Ответы [ 2 ]

4 голосов
/ 26 марта 2011

Попробуйте использовать std::vector<char> вместо std::string. Это правильный контейнер, когда вы хотите "непрерывную последовательность байтов".

С исходным контейнером std::vector код довольно прост, если вы действительно хотите просто переосмыслить данные (т. Е. Вы просто хотите обработать байты, как если бы они были последовательностью wchar_t):

std::vector<char> v = get_my_wstring_character_data();
if (v.size() % sizeof (wchar_t) != 0)
    throw std::runtime_error("Invalid wstring length");

std::wstring ws(reinterpret_cast<wchar_t*>(&v[0]), 
                reinterpret_cast<wchar_t*>(&v[0] + v.size()));

Если ваш источник std::string, этот же подход будет работать, если вы можете гарантировать, что реализация std::string, которую вы используете, хранит его символы непрерывно. На практике это всегда так.

1 голос
/ 26 марта 2011

Нет гарантии, что std::wstring хранит / интерпретирует байтовые массивы как UTF-16 (хотя случается для этого в Windows).Проверьте этот вопрос: std :: wstring VS std :: string

Поэтому я бы посоветовал вам переосмыслить идею создания std::wstring из байтового массива в кодировке UTF-16, если тольковы уверены, что ваше приложение будет когда-либо компилироваться только с MSVC.

...