получение подстроки std::wstring

Как я могу получить подстроку std::wstring, которая включает некоторые символы, отличные от ASCII?

Следующий код ничего не выводит:
(Текст представляет собой арабское слово, содержащее 4 символа, каждый из которых состоит из двух байтов, плюс слово «Привет»)

#include <iostream>
#include <string>

using namespace std;

int main()
{
    wstring s = L"سلام hello";
    wcout << s.substr(0,3) << endl;
    wcout << s.substr(4,5) << endl;

    return 0;
}

person MBZ    schedule 19.08.2013    source источник
comment
Второй должен хоть хрен печатать, а на Колиру делает. Первое может быть недоступно для печати на консоли, которую вы предположительно используете.   -  person chris    schedule 20.08.2013
comment
да, это странная часть. Я ничего не получаю.   -  person MBZ    schedule 20.08.2013
comment
На какой ОС вы запускаете этот код?   -  person Matteo Italia    schedule 20.08.2013
comment
Насколько мне известно, консоль имеет ограниченную поддержку Unicode (из-за сочетания странностей CRT и ограничений выбора шрифтов, доступных для консоли), но YMMV.   -  person Matteo Italia    schedule 20.08.2013
comment
В частности, сначала настройте все правильно для печати Unicode на консоли (см. stackoverflow.com/questions/2492077/ и blogs.msdn.com/b/michkap/archive/2008/03/18/8306597.aspx и blog.wolffmyren.com/2009/02/26 / если в шрифте по умолчанию нет нужных вам глифов), тогда поэкспериментируйте с подстроками и прочим.   -  person Matteo Italia    schedule 20.08.2013
comment
Этот вопрос не о UTF-8.   -  person Adrian McCarthy    schedule 20.08.2013
comment
Вы пользовались отладчиком? Ваш вопрос сформулирован так, как будто проблема заключается в получении подстроки, и все комментарии говорят о том, что проблема может быть просто в том, что проблема заключается в записи на консоль. Поместив подстроки в локальные wstrings, вы сможете установить, в чем проблема, и соответствующим образом отредактировать вопрос.   -  person Kate Gregory    schedule 20.08.2013
comment
если кто-то находит разбиение wstring, см. /   -  person yu yang Jian    schedule 20.04.2021


Ответы (1)


Это должно работать: жить на Coliru

#include <iostream>
#include <string>
#include <boost/regex/pending/unicode_iterator.hpp>

using namespace std;

template <typename C>
std::string to_utf8(C const& in)
{
    std::string result;
    auto out = std::back_inserter(result);
    auto utf8out = boost::utf8_output_iterator<decltype(out)>(out);

    std::copy(begin(in), end(in), utf8out);
    return result;
}

int main()
{
    wstring s = L"سلام hello";

    auto first  = s.substr(0,3);
    auto second = s.substr(4,5);

    cout << to_utf8(first)  << endl;
    cout << to_utf8(second) << endl;
}

Отпечатки

سلا
 hell

Откровенно говоря, я думаю, что ваши substring звонки делают странные предположения. Позвольте мне предложить решение этой проблемы через минуту:

person sehe    schedule 19.08.2013
comment
Ваше определение минуты 7 лет? ???? - person Code Doggo; 11.01.2020
comment
@CodeDoggo, видимо, я иногда что-то забываю :) - person sehe; 11.01.2020