<?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[Problem char* zu wchar_t*]]></title><description><![CDATA[<p>Hi<br />
Ich weiss, wenn man den Titel dieses Threades bei Google eingibt,<br />
erhält man ziemlich viele Treffer, doch irgendwie gehts bei mir nicht.<br />
Ich versuch nun schon lange char* -&gt; wchar_t* zu konvertieren.</p>
<p>Möglichst einfach und sicher.</p>
<p>Jetzt hab ich es fast geschafft:</p>
<pre><code class="language-cpp">wchar_t* CharToWide(char* source)
{
   size_t sourcesize = strlen(source) + 1;
   const size_t newsize = 100;
   size_t convertedChars = 0;
   wchar_t wcstring[newsize];
   mbstowcs_s(&amp;convertedChars, wcstring, sourcesize, source, _TRUNCATE);
   return wcstring;
}

int main()
{
   char* orig = &quot;Lol Lol Lol&quot;;
   Print(CharToWide(orig));
}
</code></pre>
<p>Ich erhalte aber immer nur &quot;Lo&quot;. Die ersten zwei Zeichen.<br />
Wenn ich aber nicht die Funktion benütze, sondern alles nacheinander<br />
schreibe, dann gehts.<br />
Kann mir das mal einer erklären? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Und was mach ich denn falsch?</p>
<p>mfg<br />
vampir26</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272064/problem-char-zu-wchar_t</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 01:10:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272064.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 Aug 2010 22:05:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem char* zu wchar_t* on Mon, 09 Aug 2010 22:05:27 GMT]]></title><description><![CDATA[<p>Hi<br />
Ich weiss, wenn man den Titel dieses Threades bei Google eingibt,<br />
erhält man ziemlich viele Treffer, doch irgendwie gehts bei mir nicht.<br />
Ich versuch nun schon lange char* -&gt; wchar_t* zu konvertieren.</p>
<p>Möglichst einfach und sicher.</p>
<p>Jetzt hab ich es fast geschafft:</p>
<pre><code class="language-cpp">wchar_t* CharToWide(char* source)
{
   size_t sourcesize = strlen(source) + 1;
   const size_t newsize = 100;
   size_t convertedChars = 0;
   wchar_t wcstring[newsize];
   mbstowcs_s(&amp;convertedChars, wcstring, sourcesize, source, _TRUNCATE);
   return wcstring;
}

int main()
{
   char* orig = &quot;Lol Lol Lol&quot;;
   Print(CharToWide(orig));
}
</code></pre>
<p>Ich erhalte aber immer nur &quot;Lo&quot;. Die ersten zwei Zeichen.<br />
Wenn ich aber nicht die Funktion benütze, sondern alles nacheinander<br />
schreibe, dann gehts.<br />
Kann mir das mal einer erklären? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Und was mach ich denn falsch?</p>
<p>mfg<br />
vampir26</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938093</guid><dc:creator><![CDATA[vampir26]]></dc:creator><pubDate>Mon, 09 Aug 2010 22:05:27 GMT</pubDate></item><item><title><![CDATA[Reply to Problem char* zu wchar_t* on Mon, 09 Aug 2010 22:10:49 GMT]]></title><description><![CDATA[<p>Du gibst einen Pointer auf eine lokale Variable zurück. Das ist undefiniert.<br />
Benutze doch als Rückgabewert std::wstring und als Argument std::string.</p>
<p>An einen C- String der std::string bzw. std::wstring Objekte kommst Du mit std::string::c_str() bzw. std::wstring::c_str().</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938094</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Mon, 09 Aug 2010 22:10:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem char* zu wchar_t* on Mon, 09 Aug 2010 22:11:24 GMT]]></title><description><![CDATA[<p>Du gibst einen Zeiger auf ein lokales Objekt zurück -&gt; undefiniertes Verhalten.</p>
<p>Außerdem ist mbstowcs_s Windows-spezifisch, also gehört das ganze ins WinAPI-Forum. Ein C++-Weg, das zu machen, wäre beispielsweise</p>
<pre><code class="language-cpp">#include &lt;string&gt;

std::wstring widen(std::string const &amp;s) {
  return std::wstring(s.begin(), s.end());
}
</code></pre>
<p>einen wchar_t const * kannst du dann mit c_str() nehmen. Wenn du einen variablen wchar_t-Buffer brauchst,</p>
<pre><code class="language-cpp">std::wstring ws = widen(&quot;foo&quot;);
wchar_t buf[LANG_GENUG];
std::copy(ws.begin(), ws.end(), buf);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1938095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938095</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 09 Aug 2010 22:11:24 GMT</pubDate></item><item><title><![CDATA[Reply to Problem char* zu wchar_t* on Mon, 09 Aug 2010 22:48:51 GMT]]></title><description><![CDATA[<p>Vielen Dank.<br />
Funktioniert einwandfrei jetzt.<br />
Machs jetzt rein c++, damit es Plattformunabhängig bleibt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    />.</p>
<p>Obwohl ich noch nicht alles 100% begreife ^^<br />
Ist kompliziert mit den ganzen Typen und Zeiger und blabla</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938100</guid><dc:creator><![CDATA[vampir26]]></dc:creator><pubDate>Mon, 09 Aug 2010 22:48:51 GMT</pubDate></item><item><title><![CDATA[Reply to Problem char* zu wchar_t* on Mon, 09 Aug 2010 23:16:09 GMT]]></title><description><![CDATA[<p>Alle Container der Standardbibliothek haben einen sog. Range-Konstruktor. Dieser nimmt zwei Iteratoren (Positionsbezeichner) entgegen, die einen Bereich beschreiben. Das funktioniert so lange, wie die Werte innerhalb dieses Bereiches in die Werte des Containers konvertibel sind.</p>
<p>Etwa kann ich so:</p>
<pre><code class="language-cpp">char hello[] = &quot;Hello, world!&quot;;
std::string s(hello, hello + 13);
std::string s2(s.begin(), s.end());
</code></pre>
<p>Strings erstellen, die &quot;Hello, world!&quot; enthalten. Auch kann ich so:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt;(s.begin(), s.end());
</code></pre>
<p>einen Integer-Vektor erstellen, der die ASCII-Werte der Buchstaben in s enthält, weil char in int umwandelbar ist. Da char ebenfalls in wchar_t (den Werttyp eines std::wstring) umwandelbar ist, kann ich auf die gleiche Weise</p>
<pre><code class="language-cpp">std::wstring ws(s.begin(), s.end());
</code></pre>
<p>schreiben und einen wstring erstellen, dessen Inhalt dem von s entspricht. Das Ergebnis ist das selbe, als hätte ich</p>
<pre><code class="language-cpp">std::wstring(s.size());

for(std::size_t i = 0; i &lt; s.size(); ++i) {
  ws[i] = s[i];
}
</code></pre>
<p>geschrieben.</p>
<p>Bei komplexen Datentypen gibt es Feinheiten mit Konstruktoren und Zuweisungsoperatoren zu beachten, aber ich hoffe, dass die grundlegende Idee damit klar geworden ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938109</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 09 Aug 2010 23:16:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem char* zu wchar_t* on Wed, 11 Aug 2010 00:00:36 GMT]]></title><description><![CDATA[<p>Thx für die Erläuterung.<br />
Jetzt versuche ich gerade die ganze Zeit alles noch in eine einzige Funktion zu packen.<br />
So, dass ich char* übergebe und wchar_t* erhalte. Ohne Zwischenstation.</p>
<p>Ich verwende die Irrlicht Engine mit der RakNet Engine, sende Pakete mache ein<br />
ganzes Login System - alles kein Problem, aber ein paar Variablen zu konvertieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /><br />
Ich bekomme dauernd Warnungen, dass die Variable unsicher ist und blabla <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Ich werd die Funktion sehr oft nutzen und deshalb ist es wichtig, dass die<br />
wirklich klappt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938525</guid><dc:creator><![CDATA[vampir26]]></dc:creator><pubDate>Wed, 11 Aug 2010 00:00:36 GMT</pubDate></item><item><title><![CDATA[Reply to Problem char* zu wchar_t* on Wed, 11 Aug 2010 20:47:20 GMT]]></title><description><![CDATA[<p>Das ist der Code:</p>
<pre><code class="language-cpp">wchar_t* ConvertCharToWidechar(std::string const &amp;s)
{
   std::wstring temp = std::wstring(s.begin(), s.end());
   wchar_t* dest = new wchar_t[strlen(s.c_str())];
   std::copy(temp.begin(), temp.end(), dest);
   return dest;
}
</code></pre>
<p>Muss ich jetzt den Speicher der Variable dest wieder freigeben? Ich bekomm nähmlich die Warnung:</p>
<pre><code>warning C4996: 'std::copy': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS.
</code></pre>
<p>Funktionieren tuts im moment gut, aber wird dann später schwierig den Fehler zu finden, wenn plötzlich was nicht mehr funzt.</p>
<p>Thx für hilfe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938920</guid><dc:creator><![CDATA[vampir26]]></dc:creator><pubDate>Wed, 11 Aug 2010 20:47:20 GMT</pubDate></item><item><title><![CDATA[Reply to Problem char* zu wchar_t* on Wed, 11 Aug 2010 21:16:12 GMT]]></title><description><![CDATA[<p>Der Compiler sagt dir lediglich, das die Funktion copy unsicher ist. D.h. es kann zu Buffer-Überläufen kommen. Sicherlich hast du davon schon in diversen Security-Meldungen auf <a href="http://heise.de" rel="nofollow">heise.de</a> und anderen Seiten gelesen, wenn mal wieder Windows, Linux, Firefox u.a. gepatcht werden müssen... wegen Buffer-Overflows.</p>
<p>MS hat sich aber damals verpflichtet, gegen solche unsicheren Funktionen vorzugehen. Auch für ihre eigenen Inhouse-Entwickler! Genau deshalb kommen solche Meldungen von MS-Compiler, weil man unsichere C-Funktionen verwendet! Andere Compiler melden so was nicht.</p>
<p>Entweder du benutzt eine sichere Funktion, oder du schaltest die Warnung ab, weil du der Meinung bist, das du es besser weißt. Und wie das geht, steht sogar am Ende der Warning-Meldung. Machen mußt du es aber selber. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Übrigens hilft die MSDN bei Warning und Error Meldungen immer weiter, in dem man Fehlercode (in disem Fall C4996) eingibt:<br />
<a href="http://msdn.microsoft.com/en-us/library/ttcz0bys.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ttcz0bys.aspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938924</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Wed, 11 Aug 2010 21:16:12 GMT</pubDate></item><item><title><![CDATA[Reply to Problem char* zu wchar_t* on Wed, 11 Aug 2010 22:38:25 GMT]]></title><description><![CDATA[<p>Du musst alles wieder freigeben, was du mit new anforderst. Faustregel: Zu jedem new ein delete, zu jedem new[] ein delete[]. Wenn es überhaupt möglich ist, nimm am besten std::string und std::wstring, die übernehmen die Speicherverwaltung für dich.</p>
<p>Was die Warnung angeht, die kannst du getrost ignorieren (bzw. das angegebene Makro in die Projekteigenschaften aufnehmen). Microsoft hat seit MSVC 2005 eine Reihe von nicht standardisierten Funktionen, die im Grunde das gleiche wie Standardfunktionen machen, aber anderes Fehlerbehandlungsverhalten haben. In einigen Fällen ist das sinnvoll, beispielsweise gets und strcpy, allerdings gibt es dafür in nahezu allen Fällen standardisierte Funktionen, die deren Probleme behandeln (gets -&gt; fgets, strcpy -&gt; strncpy).</p>
<p>Das Problem damit ist, dass MSVC mit ziemlich bei den Haaren herbeigezogenen Begründungen über nicht weiter gefährliche Funktionen warnt. Es ist ohne die *_SECURE_NO_WARNINGS-Makros nahezu unmöglich, standardkonformen C++-Code (oder auch C-Code) zu schreiben, über den MSVC sich nicht beschwert. Im Falle von std::copy kannst etwa du Probleme kriegen, wenn du dich sehr dämlich anstellst, beispielsweise</p>
<pre><code class="language-cpp">std::string s = &quot;foo&quot;, s2 = &quot;bar&quot;, s3;

// Iteratoren von zwei verschiedenen Containern als Bereichsbegrenzungen,
// d.h. KAWUMM!
std::copy(s.begin(), s2.end(), std::back_inserter(s3));
</code></pre>
<p>Natürlich kann man die _s-Funktionen auf ähnliche Weisen auch zu Blödsinn überreden, ein Gewinn ist damit also an dieser Stelle nicht wirklich zu haben.</p>
<p>Ich habe den Verdacht, dass dahinter vor allem das Bestreben steht, Programmierer dazu zu erziehen, nur unter Windows lauffähigen Code zu schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938953</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Wed, 11 Aug 2010 22:38:25 GMT</pubDate></item></channel></rss>