<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[wstring zu string und zurück]]></title><description><![CDATA[<p>Ich benutze in einem neuen Projekt zwei Bibliotheken von denen die eine wstring verwendet und die andere string. Weil ich auf Dauer nicht darum herum komme die beiden Typen ineinander zu konvertieren habe ich mir jetzt gleich zu Beginn zwei Funktionen dafür geschrieben.</p>
<p>Findet ihr diese Lösung gut oder würdet ihr das anders machen?</p>
<pre><code class="language-cpp">std::string narrow(const std::wstring&amp; widen)
{
    std::vector&lt;wchar_t&gt; wcs(widen.begin(), widen.end());
    std::vector&lt;char&gt; mbs(widen.length());
    std::wcstombs(&amp;mbs[0], &amp;wcs[0], widen.length());
    return std::string(mbs.begin(), mbs.end());
}

std::wstring widen(const std::string&amp; narrow)
{
    std::vector&lt;char&gt; mbs(narrow.begin(), narrow.end());
    std::vector&lt;wchar_t&gt; wcs(narrow.length());
    std::mbstowcs(&amp;wcs[0], &amp;mbs[0], narrow.length());
    return std::wstring(wcs.begin(), wcs.end());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/230917/wstring-zu-string-und-zurück</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 04:01:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/230917.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 03 Jan 2009 23:09:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to wstring zu string und zurück on Sat, 03 Jan 2009 23:09:55 GMT]]></title><description><![CDATA[<p>Ich benutze in einem neuen Projekt zwei Bibliotheken von denen die eine wstring verwendet und die andere string. Weil ich auf Dauer nicht darum herum komme die beiden Typen ineinander zu konvertieren habe ich mir jetzt gleich zu Beginn zwei Funktionen dafür geschrieben.</p>
<p>Findet ihr diese Lösung gut oder würdet ihr das anders machen?</p>
<pre><code class="language-cpp">std::string narrow(const std::wstring&amp; widen)
{
    std::vector&lt;wchar_t&gt; wcs(widen.begin(), widen.end());
    std::vector&lt;char&gt; mbs(widen.length());
    std::wcstombs(&amp;mbs[0], &amp;wcs[0], widen.length());
    return std::string(mbs.begin(), mbs.end());
}

std::wstring widen(const std::string&amp; narrow)
{
    std::vector&lt;char&gt; mbs(narrow.begin(), narrow.end());
    std::vector&lt;wchar_t&gt; wcs(narrow.length());
    std::mbstowcs(&amp;wcs[0], &amp;mbs[0], narrow.length());
    return std::wstring(wcs.begin(), wcs.end());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1639051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1639051</guid><dc:creator><![CDATA[OhneName]]></dc:creator><pubDate>Sat, 03 Jan 2009 23:09:55 GMT</pubDate></item><item><title><![CDATA[Reply to wstring zu string und zurück on Sun, 04 Jan 2009 06:07:54 GMT]]></title><description><![CDATA[<p>Die Quelle musst du doch nicht in nen vector stecken, da würde doch auch .c_str() funktionieren, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1639127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1639127</guid><dc:creator><![CDATA[c_str]]></dc:creator><pubDate>Sun, 04 Jan 2009 06:07:54 GMT</pubDate></item><item><title><![CDATA[Reply to wstring zu string und zurück on Sun, 04 Jan 2009 10:47:40 GMT]]></title><description><![CDATA[<p>Du hast recht! Danke!</p>
<pre><code class="language-cpp">// converts a wstring to a string
std::string narrow(const std::wstring&amp; wcs)
{
    std::vector&lt;char&gt; mbs(wcs.length());
    std::wcstombs(&amp;mbs[0], wcs.c_str(), wcs.length());
    return std::string(mbs.begin(), mbs.end());
}

// converts a string to a wstring
std::wstring widen(const std::string&amp; mbs)
{
    std::vector&lt;wchar_t&gt; wcs(mbs.length());
    std::mbstowcs(&amp;wcs[0], mbs.c_str(), mbs.length());
    return std::wstring(wcs.begin(), wcs.end());
}
</code></pre>
<p>So gefällt mir das schon deutlich besser, aber den anderen vector wird man wahrscheinlich nicht los, wenn man nicht new verwenden will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1639156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1639156</guid><dc:creator><![CDATA[OhneName]]></dc:creator><pubDate>Sun, 04 Jan 2009 10:47:40 GMT</pubDate></item><item><title><![CDATA[Reply to wstring zu string und zurück on Sun, 04 Jan 2009 17:46:00 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">// converts a wstring to a string
std::string narrow(const std::wstring&amp; wcs)
{
  std::string mbs(wcs.length(), '\0');
  std::wcstombs(&amp;mbs[0], wcs.c_str(), wcs.length());
  return mbs;
}

// converts a string to a wstring
std::wstring widen(const std::string&amp; mbs)
{
  std::wstring wcs(mbs.length(), L'\0');
  std::mbstowcs(&amp;wcs[0], mbs.c_str(), mbs.length());
  return wcs;
}
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1639403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1639403</guid><dc:creator><![CDATA[DeSoVoDaMu]]></dc:creator><pubDate>Sun, 04 Jan 2009 17:46:00 GMT</pubDate></item><item><title><![CDATA[Reply to wstring zu string und zurück on Sun, 04 Jan 2009 18:25:27 GMT]]></title><description><![CDATA[<p>Das wäre natürlich die schönste Variante. Der Standard garantiert aber nicht, dass string seine Daten in einem festen Block speichert, weshalb &amp;string[0] keine zuverlässige Lösung darstellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1639436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1639436</guid><dc:creator><![CDATA[OhneName]]></dc:creator><pubDate>Sun, 04 Jan 2009 18:25:27 GMT</pubDate></item><item><title><![CDATA[Reply to wstring zu string und zurück on Sun, 04 Jan 2009 18:50:03 GMT]]></title><description><![CDATA[<p>Ah richtig, da war doch was.<br />
Dann schreib dir ein template zur compile-time-ueberpruefung des obigen Sachverhaltes (camper hatte afair mal darauf hingewiesen, dass man herausfinden kann, ob die string-implementierung den Speicher am Stueck haelt) und nutze dann diese Methode...</p>
<p>..ODER:</p>
<p>lass es einfach so wie du es zuletzt hattest <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1639459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1639459</guid><dc:creator><![CDATA[DeSoVoDaMu]]></dc:creator><pubDate>Sun, 04 Jan 2009 18:50:03 GMT</pubDate></item><item><title><![CDATA[Reply to wstring zu string und zurück on Sun, 04 Jan 2009 22:58:05 GMT]]></title><description><![CDATA[<p>Mich würde mal interessieren, was <code>c_str()</code> zurückgibt, wenn der Speicher nicht an einem Stück ist. Denn wenn dafür extra ein neues <code>char</code> -Array angelegt wird, wer soll dann für dessen Freigabe verantwortlich sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1639546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1639546</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 04 Jan 2009 22:58:05 GMT</pubDate></item><item><title><![CDATA[Reply to wstring zu string und zurück on Mon, 05 Jan 2009 22:25:26 GMT]]></title><description><![CDATA[<p>Bitte beantwortet die Frage von Nexus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640161</guid><dc:creator><![CDATA[pusch]]></dc:creator><pubDate>Mon, 05 Jan 2009 22:25:26 GMT</pubDate></item><item><title><![CDATA[Reply to wstring zu string und zurück on Tue, 06 Jan 2009 00:02:55 GMT]]></title><description><![CDATA[<p>soweit ich weiß, ist ebenso wenig garantiert, dass der zurückgelieferte pointer nach einer weitern non-const operation auf der selben string instanz noch auf eienn verwendbaren speicherbereich zeigt. dh c_str könnte speicher allokieren, die adresse davon nicht nur zurückgeben, sondern auch intern speichern und bei der nächsten non-const operation auf diesem string den speicher wieder freigeben. ich _vermute_ aber, dass keine string implementierung das so krank macht und einfach intern einen normalen null-terminierten string verwendet und einfach den immer zurück gibt. wichtig ist aber, dass man das, was c_str zurück gibt, natürlich problemlos wie einen const char* verwenden kann. dort ist alles fix in einem stück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640191</guid><dc:creator><![CDATA[besserwisser]]></dc:creator><pubDate>Tue, 06 Jan 2009 00:02:55 GMT</pubDate></item><item><title><![CDATA[Reply to wstring zu string und zurück on Tue, 06 Jan 2009 00:21:31 GMT]]></title><description><![CDATA[<p>besserwisser schrieb:</p>
<blockquote>
<p>soweit ich weiß, ist ebenso wenig garantiert, dass der zurückgelieferte pointer nach einer weitern non-const operation auf der selben string instanz noch auf eienn verwendbaren speicherbereich zeigt.</p>
</blockquote>
<p>Guter Einwand - das könnte einem tatsächlich Sorgen bereiten. Gerade weil <code>const char*</code> oft auf Stringliterale zeigt, und diese statische Gültigkeitsdauer besitzen, könnte man da schnell in etwas reinreiten. Weiss jemand Genaueres darüber?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640199</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 06 Jan 2009 00:21:31 GMT</pubDate></item></channel></rss>