<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3829530</guid>
        <pubDate>Tue, 28 Apr 2020 19:23:20 +0000</pubDate>
        <title>std::string to std::wstring</title>
        <link>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3829530</link>
        <description><![CDATA[Qraizer: Потому что в данном случае это не обязательное RVO, а необязательное NVRO. Чтобы сделать его обязательным, нужно buf явным образом из lvalue скастовать к rvalue или rvalue ref, что std::move() в общем-то и делает.<br>В целом не спорю, что это мешает тем компиляторам, которые всё ж делают необязательную оптимизацию. Зато так оптимизация делается, хоть и чуть хуже, но для всех.<br><br>Хотя вру, в C++17 и такую оптимизацию уже объявили обязательной. Ну что делать, код древний. Нынче std::move() можно смело убрать... наверное. &lt;_&lt;]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3829223</guid>
        <pubDate>Sat, 25 Apr 2020 06:16:03 +0000</pubDate>
        <title>std::string to std::wstring</title>
        <link>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3829223</link>
        <description><![CDATA[OpenGL: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414620&view=findpost&p=3795791'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2019-04-16T16:15:01+00:00">16.04.19, 16:15</time></span><div class='quote '> return std::move(buf);</div></div><br>
std::move же мешает RVO. Зачем он тут нужен?]]></description>
        <author>OpenGL</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3829202</guid>
        <pubDate>Fri, 24 Apr 2020 19:37:28 +0000</pubDate>
        <title>std::string to std::wstring</title>
        <link>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3829202</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414620&view=findpost&p=3829164'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-04-24T17:38:48+00:00">24.04.20, 17:38</time></span><div class='quote '>Но всё равно объёмы работ над STL весьма немалы.</div></div><br>
Тут да - не вопрос. Но что они с кодировками будут делать, вопрос? Вангую - ничего&#33; :lol: Будут или отказываться или динамить.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3829166</guid>
        <pubDate>Fri, 24 Apr 2020 17:45:22 +0000</pubDate>
        <title>std::string to std::wstring</title>
        <link>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3829166</link>
        <description><![CDATA[Qraizer: :huh: Что тут можно откомментить-то. Я пользовался, знаю. Но ведь и задача не настолько глобальная. У ICU жирный API, от STL такого не требуется. + я ещё подозреваю, что никто не будет даже в мыслях на STL перекладывать задачи, которые решаются кучей отдельных и самостоятельных RFC. Вполне достаточно, чтобы, как и в любых других подобных случаях, стандартная библиотека обеспечила лишь кросс-платформенный прокси к API используемой ОС. Ну т.е. если ОС не поддерживает китайские кодовые страницы, ну и ваши аппликухи через STL туда не вхожи, а ежели вдруг надо, просто настройте свою ОСь. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-04-24T17:47:45+00:00">24.04.20, 17:47</time></span></span><br>
Но всё равно объёмы работ над STL весьма немалы.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3829164</guid>
        <pubDate>Fri, 24 Apr 2020 17:38:48 +0000</pubDate>
        <title>std::string to std::wstring</title>
        <link>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3829164</link>
        <description><![CDATA[JoeUser: <strong class='tag-b'>Qraizer</strong>, жду твоего коммента на свой коммент. Мне это важно  :-?]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3829103</guid>
        <pubDate>Fri, 24 Apr 2020 06:06:32 +0000</pubDate>
        <title>std::string to std::wstring</title>
        <link>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3829103</link>
        <description><![CDATA[JoeUser: <strong class='tag-b'>Qraizer</strong>, тут еще один момент, который нельзя упускать. Не столько сама сложность работы с перекодировкой, а в какой объем это все выливается. И тут комитет понять можно. Кто пользовался библиотекой <a class='tag-url' href='http://site.icu-project.org/home' target='_blank'>ICU</a> - поймет, там одна библиотека весит порядка 25Mb, что почти в 4-ре раза тяжелее STL.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3829083</guid>
        <pubDate>Thu, 23 Apr 2020 19:22:23 +0000</pubDate>
        <title>std::string to std::wstring</title>
        <link>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3829083</link>
        <description><![CDATA[Qraizer: В общем, выдалось немного свободного времени, и я порылся в преамбуле вопроса. Могу написать много, но не думаю, что имеет смысл. Так, кратенько.<br>
Во-первых, почему оно вообще появилось. Не думаю, что стоит подробно разъяснять, что потребность в поддержке юникода к C++11 назрела куда сильнее, чем во времена C++98. До 21-го века он фактически ещё только разрабатывался, хотя ревизии выходили регулярно уже с десяток лет, и только где-то с версии 4.0 более-менее стабилизировался. Понятно, что для C++03 поддержка юникода была бы слишком уж большим апгрейдом.<br>
Во-вторых. Решили обойтись малой кровью. Не знаю, почему, та и неважно. В целом, std::wstring_convert&lt;&gt;, принимающий фасет перекодирования, вполне нормальное решение, учитывая, что std::codecvt&lt;&gt; уже документировал нужный интерфейс. Было бы неплохо лишь к интерфейсу добавить реализации, что и было сделано в лице std::codecvt_utf8&lt;&gt; (UCS2/4 ⇔ UTF-8), std::codecvt_utf16&lt;&gt; (UCS2/4 ⇔ UTF-16) и std::codecvt_utf8_utf16&lt;&gt; (UTF-8 ⇔ UTF-16). И это даже вполне вменяемо работало и удобно пользовалось. Всего-то запомнить, что .to_bytes() конвертит наш юникод в байты, а .from_bytes() обратно. Была только ИМХО одна проблема, но о ней позже. Но помимо преобразования строк часто также были востребованы ввод/вывод, и Комитет решил поддержать его отдельно, чтоб людям не приходилось конвертить строки в дополнение к вводу/выводу, а чтобы оно само прям во время ввода/вывода. И вот тут и всплыла куча нестыковок.<br>
Во-вторых/во-первых. &quot;Внезапно&quot; выяснилось, что Стандарт документирует использование std::codecvt&lt;&gt; только для файловых потоков. То бишь basic_filebuf&lt;&gt; и никак иначе. А так как он прямой потомок std::basic_streambuf&lt;&gt;, который плевать хотел на std::codecvt&lt;&gt;, и это однако строго по Стандарту, то std::codecvt&lt;&gt; выпадают из поля зрения даже наших любимых std::cin, std::cout и иже с ними, не говоря уже о любых производных от std::basic_streambuf&lt;&gt;. Ну, кто пытался &quot;русифицировать консоль&quot; в винде и написать что-то типа codecvt_1251vs866, тот и сам знает. Так что единственно подходящим решением было написать нового потомка от std::basic_streambuf&lt;&gt;, научить его работать с std::codecvt&lt;&gt; и внедрить его между форматирующими std:: (i)(o)stream&lt;&gt; и буферизирующим std::basic_streambuf&lt;&gt;. Так родились std::wbuffer_convert&lt;&gt;. И юзать их предполагалось как-то так: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;// создаём конвертер из UCS2 в UTF-8 и связываем с его выходом буферизирующий класс консольного вывода</div><div class="code_line">&nbsp;&nbsp;std::wbuffer_convert&#60;std::codecvt_utf8&#60;wchar_t&#62;&#62; proxy(std::cout.rdbuf());</div><div class="code_line">&nbsp;&nbsp;// создаём широкий поток вывода и связываем его со входом конвертера</div><div class="code_line">&nbsp;&nbsp;std::wostream u8out(&amp;proxy); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// вуаля</div><div class="code_line">&nbsp;&nbsp;u8out &#60;&#60; L&quot;Привет, мир!&quot;;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>Нет никаких дополнительных .to_bytes()/.from_bytes(), ибо и так понятно, что &lt;&lt; выводит, а &gt;&gt; вводит, соответственно std::basic_stream&lt;&gt;, ну или как его там, сам будет вызывать нужные std::basic_streambuf&lt;&gt;::overflow()/underflow(). Это также позволяет включать кучу таких конвертеров в цепочку, если вдруг понадобится... с нюансом, правда, но об этом ниже. И это даже тоже прекрасно работало, включая потоки, форматирующие в памяти а-ля std::basic_stringstream&lt;&gt;. Правда, для последних оно как бы без надобности, ибо зачем, если у нас уже есть std::wstring_convert&lt;&gt;.<br>
Во-вторых/во-вторых. &quot;Внезапно&quot; выяснилось, что потоки, в отличие от строк, в абсолютно подавляющем большинстве случаев только читаются или только пишутся. Просто потому что чаще всего создаются именно (точнее, производные от них) std::basic_istream&lt;&gt; или std::basic_ostream&lt;&gt;, а вот std::basic_iostream&lt;&gt; огромная редкость. Поэтому, хотя и весьма несложно сконвертить UTF-16 в UTF-8 при &lt;&lt;, то вот сделать наоборот UTF-8 в UTF-16 при том же &lt;&lt; уже хренушки, нету такой фичи у этих потоков. Не, ну можно конечно заюзать костыли, но Комитет-то вроде хотел наоборот, избавить народ от костылей. Но это ещё полбеды, вторая полбеда, чья причина описана ниже, приводит к тому, что к выводу std::wbuffer_convert&lt;&gt; можно присобачить только байтовые потоки, т.е. конкретно std::streambuf, а не обобщённый std::basic_streambuf&lt;&gt;. Так что да, с цепочками конвертеров есть нюанс: кроме первого, все остальные должны быть байтовыми конвертерами.<br>
Во-вторых/в-третьих. В эпоху С++98 о юникодовых файлах ещё никто не думал. Везде только и делали, что хранили обычные байтовые, при необходимости задействуя многобайтовые кодировки. Собственно, это и нашло отражение в том, что стандартная локаль обязана иметь только std::codecvt&lt;char, char, std::mbstate_t&gt; и std::codecvt&lt;wchar_t, char, std::mbstate_t&gt;, т.е. внешнее представление всегда байтовое. Ненуачё, кому надо, пусть делает std::codecvt&lt;wchar_t, wchar_t, std::mbstate_t&gt; сам, ибо юникод ещё молод и наивен и ничего конкретного потребовать не способен. Так что даже если вы создаёте std::wfilebuf, пусть и опосредовано, посредством std::wofstream, то на выходе в файле всё равно будет последовательность char, так или иначе преобразованных из исходных последовательностей wchar_t, а не эти самые исходные wchar_t, ибо так говорит делать Стандарт. Упс. И ему плевать, был ли над ним некий конвертер, или же ему пришла исходная строка, которую нужно обработать. Вот и получается, что несмотря на то, что если для некоего, скажем, std::ofstream вы создадите конвертер, скажем, из UCS4 в UTF-16 и привяжете его к его std::filebuf, то из-за того, что никто не отменял в локали этого std::ofstream вон тот std::codecvt&lt;wchar_t, char, std::mbstate_t&gt;, и удалить его оттуда вообще невозможно, просто нет такого API, то ваш чудесно подготовленный конвертером вывод в формате UTF-16 не менее чудесно будет убит до char. Хренушки вы получите файл в UTF-16 одним словом без бубнов и танца. Не, ну можно, но за костыли уже говорилось.<br>
В-третьих. Короче, &lt;codecvt&gt; был признан неудачным. И даже если ограничиться только std::wstring_convert&lt;&gt;, это будет только половиной решения, т.к. помимо юникода вообще-то существует куда больше региональных кодировок. Десятки. Даже для char ⇔ char их как собак на свалке. То же ANSI⇔OEM, например. А сколько всяких разных латиниц... и их диакретикой, сдвоенными символами итп.<br>
Итог. Там готовится что-то сильно масштабнее. Уже далеко не малой кровью. Подозреваю, что хотят в фасетах запилить чуть ли не все кодовые страницы и стандартизировать для этого отдельный интерфейс. Вряд ли мы это увидим даже в C++23. Что касается функционала, объявленного устаревшим, то просто не хотят, чтобы люди на него тратили много внимания в новых проектах. Вряд ли он куда-то денется в будущих релизах Стандарта. Никуда ж не делись std::strstream, например, или там std::plus&lt;&gt;.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3795793</guid>
        <pubDate>Tue, 16 Apr 2019 16:43:31 +0000</pubDate>
        <title>std::string to std::wstring</title>
        <link>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3795793</link>
        <description><![CDATA[Wound: Да я тут просто решил пуститься во все тяжкие, и уже больше пол года на C# опять пишу, ну решил вспомнить былое, да кругозор немного расширить. В итоге от плюсов отвык, а к шарпам привык - там то подобные выкрутасы делаются предельно легко и без напряга. А сейчас нужно было небольшой проект запилить на плюсах, в итоге вот понадобилось в поток выводить сразу и std::string и std::wstring, помню что когда то с codecvt работал и норм было, но так же помню что он deprecated, а из за этого толи предупреждение летело то ли ошибка компиляции уж не помню. Решил поискать, нашел что ниче нема такого. Весьма удивился. Уже вроде какой там? С++24 стандарт пилят? А такой нужной вещи никак не могут ввести в язык.<br>За этот код тоже спасибо. Завтра прикручу уже.]]></description>
        <author>Wound</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3795791</guid>
        <pubDate>Tue, 16 Apr 2019 16:15:01 +0000</pubDate>
        <title>std::string to std::wstring</title>
        <link>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3795791</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414620&view=findpost&p=3795775'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-04-16T14:00:18+00:00">16.04.19, 14:00</time></span><div class='quote '>А как тогда можно без гемороя вывести в поток std::wostringstream переменную типа std::string ?</div></div>У меня давно уж накидано<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">std::string &nbsp;toNarrow(const std::wstring&amp; str, const std::ctype&#60;wchar_t&#62;&amp; ct = std::use_facet&#60;std::ctype&#60;wchar_t&#62;&#62;(std::locale::classic()));</div><div class="code_line">std::wstring toWide &nbsp;(const std::string&amp; &nbsp;str, const std::ctype&#60;wchar_t&#62;&amp; ct = std::use_facet&#60;std::ctype&#60;wchar_t&#62;&#62;(std::locale::classic()));</div><div class="code_line">&nbsp;</div><div class="code_line">/* -------------------------------------------*/ </div><div class="code_line">&nbsp;</div><div class="code_line">std::string toNarrow(const std::wstring&amp; str, const std::ctype&#60;wchar_t&#62;&amp; ct)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;std::string buf(str.length(), char());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (!buf.empty()) ct.narrow(str.data(), str.data()+buf.size(), &#39;`&#39;, &amp;buf[0]);</div><div class="code_line">&nbsp;&nbsp;return std::move(buf);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">std::wstring toWide(const std::string&amp; str, const std::ctype&#60;wchar_t&#62;&amp; ct)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;std::wstring buf(str.length(), wchar_t());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (!buf.empty()) ct.widen(str.data(), str.data()+buf.size(), &amp;buf[0]);</div><div class="code_line">&nbsp;&nbsp;return std::move(buf);</div><div class="code_line">}</div></ol></div></div></div></div>Deprecated там этот codecvt или нет, но оно универсальнее. Но и сложнее, тут с Комитетом не поспоришь. А вообще, пользуй его на здоровье, кто не даёт-то. Окайми в отдельный там namespace к примеру, и как только, так сразу и заменишь на non deprecated.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3795775</guid>
        <pubDate>Tue, 16 Apr 2019 14:00:18 +0000</pubDate>
        <title>std::string to std::wstring</title>
        <link>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3795775</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414620&view=findpost&p=3795774'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2019-04-16T13:48:41+00:00">16.04.19, 13:48</time></span><div class='quote '>Ему ищут варианты замены. Или делают вид, что ищут. Он deprecated, потому что оказался неудобен, и Комитет не хочет, чтобы много приложений успело его заюзать.</div></div><br>
Это пичально :&#39;(<br>
А как тогда можно без гемороя вывести в поток std::wostringstream переменную типа std::string ? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-04-16T14:05:34+00:00">16.04.19, 14:05</time></span></span><br>
Ладно, нашел прям тут как можно с гемороем делать - <a class='tag-url' href='https://forum.sources.ru/index.php?showtopic=291288' target='_blank'>Преобразование std::string в std::wstring туда и обратно, как делается?</a><br>
Но все равно это очень пичально я считаю.]]></description>
        <author>Wound</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3795774</guid>
        <pubDate>Tue, 16 Apr 2019 13:48:41 +0000</pubDate>
        <title>std::string to std::wstring</title>
        <link>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3795774</link>
        <description><![CDATA[Qraizer: Ему ищут варианты замены. Или делают вид, что ищут. Он deprecated, потому что оказался неудобен, и Комитет не хочет, чтобы много приложений успело его заюзать.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3795772</guid>
        <pubDate>Tue, 16 Apr 2019 13:46:47 +0000</pubDate>
        <title>std::string to std::wstring</title>
        <link>https://forum.sources.ru/index.php?showtopic=414620&amp;view=findpost&amp;p=3795772</link>
        <description><![CDATA[Wound: Всем привет&#33; <br><br>И так, какой там у нас уже стандарт вышел в С++ ? Что там у нас язык умеет? Например конвертнуть std::string в std::wstring есть возможность сделать это максимально быстро и эффективно? А то я смотрю был функционал с codecvt, но он вроде как deprecated стал(Чем они вообще в своем комитете занимаются?).]]></description>
        <author>Wound</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	