<?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[VS 2008 wchar_t --&amp;gt; UTF8]]></title><description><![CDATA[<p>Hallo,</p>
<p>Das Hauptproblem : ein &quot;Copyright&quot; Zeichen wird nach Konvertierung<br />
wchar_t* --&gt; char*<br />
stets als &quot;A mit Dach&quot; plus &quot;Copyright&quot; angezeigt, sowohl im Debugger<br />
als auch in der ausgebenden Grafik API.</p>
<p>Folgende Ansätze sind bereits fehlgeschlagen :</p>
<p>-- Verwenden von WideCharToMultiByte() -- hier wird das gleiche angezeigt.</p>
<p>-- wcstombs_s() scheint kein UTF8 zu erzeugen, der konvertierte String sieht<br />
im Debugger ok aus, ist aber laut verwendeter API kein UTF8 und wird nicht<br />
angezeigt (KEIN Wunder, da UTF8 != MultiByte)</p>
<p>-- Wenn ein String im UTF-8 Format direkt in das Programm geschrieben wird,<br />
wird er bereits vom Debugger in obiger falscher weise angezeigt :<br />
z.B. char l_lasttry[] = {'\xc2','\xa9'} ergibt das obige. Dies ergibt<br />
sich auch, wenn man std::string nutzt.</p>
<p>-- Ich habe schon das File als unsigned - UTF8 gespeichert.<br />
Das Programm muss ich als &quot;multibyte&quot; kompilieren, da die verwendete<br />
API multibyte nutzt.</p>
<p>Hier ein Beispiel, wobei die UTF8Util::ConvertUTF16ToUTF8<br />
bloss WideCharToMultiByte() in korrekter Weise nutzt.</p>
<pre><code class="language-cpp">wchar_t* buf = L&quot;\u00A9&quot;; 
CStringA l_cstra = UTF8Util::ConvertUTF16ToUTF8(buf);
</code></pre>
<p>und hier zur Info die WideCharToMultiByte() Funktion<br />
(von einem Microsoft-Entwickler ...)<br />
Wie gesagt kommt es garnicht unbedingt auf diese Funktion an,<br />
andere Wege führen auch zum gleichen Problem<br />
Ach ja, mit locales hab ichs auch schon versucht ....</p>
<pre><code class="language-cpp">CStringA ConvertUTF16ToUTF8( __in const WCHAR * pszTextUTF16 )
{
	//
	// Special case of NULL or empty input string
	//
	if ( (pszTextUTF16 == NULL) || (*pszTextUTF16 == L'\0') )
	{
		// Return empty string
		return &quot;&quot;;
	}

	//
	// Consider WCHAR's count corresponding to total input string length,
	// including end-of-string (L'\0') character.
	//

	const size_t cchUTF16Max = INT_MAX - 1;
	size_t cchUTF16;
	HRESULT hr = ::StringCchLengthW( pszTextUTF16, cchUTF16Max, &amp;cchUTF16 );
	if ( FAILED( hr ) )
	{
		AtlThrow( hr );
	}

	// Consider also terminating \0
	++cchUTF16;

	//
	// WC_ERR_INVALID_CHARS flag is set to fail if invalid input character
	// is encountered.
	// This flag is supported on Windows Vistaand later.
	// Don't use it on Windows XP and previous.
	//

	//#if (WINVER &gt;= 0x0600)
	//
	//	DWORD dwConversionFlags = WC_ERR_INVALID_CHARS;
	//
	//#else
	DWORD dwConversionFlags = 0;
	//#endif

	//
	// Get size of destination UTF-8 buffer, in CHAR's (= bytes)
	//
	int cbUTF8 = ::WideCharToMultiByte(
		CP_UTF8,                // convert to UTF-8
		dwConversionFlags,      // specify conversion behavior
		pszTextUTF16,           // source UTF-16 string
		static_cast&lt;int&gt;( cchUTF16 ),   // total source string length, in WCHAR's,
		// including end-of-string \0
		NULL,                   // unused - no conversion required in this step
		0,                      // request buffer size
		NULL, NULL              // unused
		);
	ATLASSERT( cbUTF8 != 0 );
	if ( cbUTF8 == 0 )
	{
		AtlThrowLastWin32();
	}

	// Allocate destination buffer for UTF-8 string
	//
	CStringA strUTF8;
	int cchUTF8 = cbUTF8; // sizeof(CHAR) = 1 byte
	CHAR * pszUTF8 = strUTF8.GetBuffer( cchUTF8 );
	//
	// Do the conversion from UTF-16 to UTF-8
	//
	int result = ::WideCharToMultiByte(
		CP_UTF8,                // convert to UTF-8
		dwConversionFlags,      // specify conversion behavior
		pszTextUTF16,           // source UTF-16 string
		static_cast&lt;int&gt;( cchUTF16 ),   // total source string length, in WCHAR's,
		// including end-of-string \0
		pszUTF8,                // destination buffer
		cbUTF8,                 // destination buffer size, in bytes
		NULL, NULL              // unused
		); 
	ATLASSERT( result != 0 );
	if ( result == 0 )

	{
		AtlThrowLastWin32();
	}
	// Release internal CString buffer
	strUTF8.ReleaseBuffer();
	// Return resulting UTF-8 string
	return strUTF8;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/266901/vs-2008-wchar_t-gt-utf8</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 18:12:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/266901.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 16 May 2010 12:23:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to VS 2008 wchar_t --&amp;gt; UTF8 on Sun, 16 May 2010 12:23:16 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Das Hauptproblem : ein &quot;Copyright&quot; Zeichen wird nach Konvertierung<br />
wchar_t* --&gt; char*<br />
stets als &quot;A mit Dach&quot; plus &quot;Copyright&quot; angezeigt, sowohl im Debugger<br />
als auch in der ausgebenden Grafik API.</p>
<p>Folgende Ansätze sind bereits fehlgeschlagen :</p>
<p>-- Verwenden von WideCharToMultiByte() -- hier wird das gleiche angezeigt.</p>
<p>-- wcstombs_s() scheint kein UTF8 zu erzeugen, der konvertierte String sieht<br />
im Debugger ok aus, ist aber laut verwendeter API kein UTF8 und wird nicht<br />
angezeigt (KEIN Wunder, da UTF8 != MultiByte)</p>
<p>-- Wenn ein String im UTF-8 Format direkt in das Programm geschrieben wird,<br />
wird er bereits vom Debugger in obiger falscher weise angezeigt :<br />
z.B. char l_lasttry[] = {'\xc2','\xa9'} ergibt das obige. Dies ergibt<br />
sich auch, wenn man std::string nutzt.</p>
<p>-- Ich habe schon das File als unsigned - UTF8 gespeichert.<br />
Das Programm muss ich als &quot;multibyte&quot; kompilieren, da die verwendete<br />
API multibyte nutzt.</p>
<p>Hier ein Beispiel, wobei die UTF8Util::ConvertUTF16ToUTF8<br />
bloss WideCharToMultiByte() in korrekter Weise nutzt.</p>
<pre><code class="language-cpp">wchar_t* buf = L&quot;\u00A9&quot;; 
CStringA l_cstra = UTF8Util::ConvertUTF16ToUTF8(buf);
</code></pre>
<p>und hier zur Info die WideCharToMultiByte() Funktion<br />
(von einem Microsoft-Entwickler ...)<br />
Wie gesagt kommt es garnicht unbedingt auf diese Funktion an,<br />
andere Wege führen auch zum gleichen Problem<br />
Ach ja, mit locales hab ichs auch schon versucht ....</p>
<pre><code class="language-cpp">CStringA ConvertUTF16ToUTF8( __in const WCHAR * pszTextUTF16 )
{
	//
	// Special case of NULL or empty input string
	//
	if ( (pszTextUTF16 == NULL) || (*pszTextUTF16 == L'\0') )
	{
		// Return empty string
		return &quot;&quot;;
	}

	//
	// Consider WCHAR's count corresponding to total input string length,
	// including end-of-string (L'\0') character.
	//

	const size_t cchUTF16Max = INT_MAX - 1;
	size_t cchUTF16;
	HRESULT hr = ::StringCchLengthW( pszTextUTF16, cchUTF16Max, &amp;cchUTF16 );
	if ( FAILED( hr ) )
	{
		AtlThrow( hr );
	}

	// Consider also terminating \0
	++cchUTF16;

	//
	// WC_ERR_INVALID_CHARS flag is set to fail if invalid input character
	// is encountered.
	// This flag is supported on Windows Vistaand later.
	// Don't use it on Windows XP and previous.
	//

	//#if (WINVER &gt;= 0x0600)
	//
	//	DWORD dwConversionFlags = WC_ERR_INVALID_CHARS;
	//
	//#else
	DWORD dwConversionFlags = 0;
	//#endif

	//
	// Get size of destination UTF-8 buffer, in CHAR's (= bytes)
	//
	int cbUTF8 = ::WideCharToMultiByte(
		CP_UTF8,                // convert to UTF-8
		dwConversionFlags,      // specify conversion behavior
		pszTextUTF16,           // source UTF-16 string
		static_cast&lt;int&gt;( cchUTF16 ),   // total source string length, in WCHAR's,
		// including end-of-string \0
		NULL,                   // unused - no conversion required in this step
		0,                      // request buffer size
		NULL, NULL              // unused
		);
	ATLASSERT( cbUTF8 != 0 );
	if ( cbUTF8 == 0 )
	{
		AtlThrowLastWin32();
	}

	// Allocate destination buffer for UTF-8 string
	//
	CStringA strUTF8;
	int cchUTF8 = cbUTF8; // sizeof(CHAR) = 1 byte
	CHAR * pszUTF8 = strUTF8.GetBuffer( cchUTF8 );
	//
	// Do the conversion from UTF-16 to UTF-8
	//
	int result = ::WideCharToMultiByte(
		CP_UTF8,                // convert to UTF-8
		dwConversionFlags,      // specify conversion behavior
		pszTextUTF16,           // source UTF-16 string
		static_cast&lt;int&gt;( cchUTF16 ),   // total source string length, in WCHAR's,
		// including end-of-string \0
		pszUTF8,                // destination buffer
		cbUTF8,                 // destination buffer size, in bytes
		NULL, NULL              // unused
		); 
	ATLASSERT( result != 0 );
	if ( result == 0 )

	{
		AtlThrowLastWin32();
	}
	// Release internal CString buffer
	strUTF8.ReleaseBuffer();
	// Return resulting UTF-8 string
	return strUTF8;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1897862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1897862</guid><dc:creator><![CDATA[Lordolin]]></dc:creator><pubDate>Sun, 16 May 2010 12:23:16 GMT</pubDate></item><item><title><![CDATA[Reply to VS 2008 wchar_t --&amp;gt; UTF8 on Sun, 16 May 2010 12:40:43 GMT]]></title><description><![CDATA[<p>welche Grafik API?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1897872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1897872</guid><dc:creator><![CDATA[hjcgfcfg]]></dc:creator><pubDate>Sun, 16 May 2010 12:40:43 GMT</pubDate></item><item><title><![CDATA[Reply to VS 2008 wchar_t --&amp;gt; UTF8 on Sun, 16 May 2010 13:47:48 GMT]]></title><description><![CDATA[<p>Lordolin schrieb:</p>
<blockquote>
<p>-- Wenn ein String im UTF-8 Format direkt in das Programm geschrieben wird,<br />
wird er bereits vom Debugger in obiger falscher weise angezeigt :<br />
z.B. char l_lasttry[] = {'\xc2','\xa9'} ergibt das obige. Dies ergibt<br />
sich auch, wenn man std::string nutzt.</p>
</blockquote>
<p>Woher soll denn der Debugger auch wissen, dass du der Meinung bist, der Inhalt des char oder std::string sei als UTF-8 zu verstehen. Da musst du schon einen eigenen Visualizer für UTF-8 schreiben.</p>
<p>Hab aus Neugier gerade mal getestet, wie andere es anzeigen. Der C++ Builder 2010 zeigt bei folgendem Code</p>
<pre><code class="language-cpp">UnicodeString orig = L&quot;\u00A9&quot;;
UTF8String conv = orig;
</code></pre>
<p>auch an</p>
<p>conv {}<br />
Data<br />
[0] <em>A mit Dach</em> -62 (0xC2)<br />
[1] <em>Copyright Symbol</em> -87 (0xA9)<br />
[2] '\0' 0 (0x00)</p>
<p>wenn man die Maus draufhält. Die Debugger interpretieren einfach die einzelnen Zeichen.</p>
<p>Wenn deine Grafik API das auch macht, kann sie halt kein UTF-8.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1897911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1897911</guid><dc:creator><![CDATA[nn]]></dc:creator><pubDate>Sun, 16 May 2010 13:47:48 GMT</pubDate></item><item><title><![CDATA[Reply to VS 2008 wchar_t --&amp;gt; UTF8 on Sun, 16 May 2010 16:45:00 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn deine Grafik API das auch macht, kann sie halt kein UTF-8.</p>
</blockquote>
<p>Hallo und vielen Dank für die Antwort !<br />
Die API (es handelt sich um VTK von Kitware) kann allerdings UTF-8, zumindest laut Doku ... Schliesslich wird das &quot;Copyright&quot; Zeichen ja auch gerendered, aber mit dem unerwünschten &quot;A mit Dach&quot; davor ...<br />
Dass der Debugger das nun auch so macht ist dann wohl Zufall, und die API erwartet eine andere Art der Konvertierung.</p>
<p>Nun habe ich noch folgendes Experiment gemacht : Die API kann auch einen 16- Bit Unicode String, dem habe ich den w_char* im Konstruktor übergeben. Nun gibt es die Funktion vtkUnicodeString.to_utf8(), welche im Grunde einen verkappten std::string zurückgibt, der nun UTF8 sein soll. Allerdings kommt hier das gleiche Problem hoch (beim Rendering, im Debugger eh, aber ist ja wie oben erkannt unabhängig voneinander) !</p>
<p>Also bin ich mit meinem Latein am Ende. Gibt es evtl irgendwelche locale-Settings o.ä., die ich beachten muss ?<br />
Muss die Bibliothek selber evtl mit anderen flags gebaut werden ? (Wobei sie mit UNICODE Flag nicht baut, nur mit MultiChar ...)</p>
<p>Beste Grüße,<br />
Lordolin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1897993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1897993</guid><dc:creator><![CDATA[Lordolin]]></dc:creator><pubDate>Sun, 16 May 2010 16:45:00 GMT</pubDate></item><item><title><![CDATA[Reply to VS 2008 wchar_t --&amp;gt; UTF8 on Sun, 16 May 2010 17:33:30 GMT]]></title><description><![CDATA[<p>Hmm, habe gerade durch nen QuickHack herausgefunden,<br />
dass alles als Windows ASCII interpretiert wird, obwohl<br />
Beispiele und Doku anderes &quot;suggerieren&quot;. NA TOLL. Danke allen für die Hilfe,<br />
das wars dann wohl erstmal mit Unicode. Schade bloss um die Zeit, die ich mit dem<br />
... verbracht hab.</p>
<p>LG, Lordolin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898019</guid><dc:creator><![CDATA[Lordolin]]></dc:creator><pubDate>Sun, 16 May 2010 17:33:30 GMT</pubDate></item><item><title><![CDATA[Reply to VS 2008 wchar_t --&amp;gt; UTF8 on Mon, 17 May 2010 13:18:05 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>vielleicht hilft hier folgende Biliothek weiter.</p>
<p><a href="http://utfcpp.sourceforge.net/" rel="nofollow">http://utfcpp.sourceforge.net/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898400</guid><dc:creator><![CDATA[schoetbi]]></dc:creator><pubDate>Mon, 17 May 2010 13:18:05 GMT</pubDate></item></channel></rss>