<?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[die Bytes aus einem wstring auslesen]]></title><description><![CDATA[<p>Hallo,<br />
ich möchte einen Unicodestring speichern und habe Probleme dabei.</p>
<p>Mit folgenden Konstrukt bekomme ich eine Datei hin die<br />
erstmal die BOMn enthält.</p>
<pre><code class="language-cpp">vector&lt;unsigned short&gt; text16;
    text16.push_back(0xfeff); // bom

    ofstream fs16(&quot;c:/utf16.txt&quot;, ios_base::out | ios_base::binary);
    fs16.write(reinterpret_cast&lt;const char*&gt;(&amp;text16[0]), text16.size() * sizeof (unsigned short));
</code></pre>
<p>jetzt habe ich eine Klasse die von std::wstring erbt<br />
und wollte gern einen String in die Datei speichern.<br />
Leider klappt das nicht.<br />
Beim Betrachten mit einem Hex-Editor stelle ich fest das das zweite Byte nicht<br />
korrekt gespeichert wird.</p>
<p>Beim Speichern mit folgendem Code</p>
<pre><code class="language-cpp">std::fstream ziel(&quot;c:/unicode.txt&quot;,ios_base::out|ios_base::binary);
char *pc = Global::Conv_pwc2pc(value);

// unicode Signatur
ziel &lt;&lt; std::hex;
ziel &lt;&lt; 0xFFFE;
ziel &lt;&lt; &quot;PC value: &quot; &lt;&lt; pc &lt;&lt; &quot;\n&quot;;
ziel &lt;&lt; &quot;RString value: &quot;;
ziel &lt;&lt; value ;
ziel &lt;&lt; &quot;\n&quot;;
ziel.close();
</code></pre>
<p>wird die Signatur nicht korrekt abgelegt, außerdem der RString<br />
weil der Operator &lt;&lt; so überladen ist das die Adresse an der der RString liegt ausgegeben wird.</p>
<p>Jetzt wollte ich die Bytes einzeln speichern, kann aber auf das zweite nicht korrekt zugreifen:</p>
<pre><code class="language-cpp">wstring tmp;
	char a[100];
	for (int i=0; i&lt;(value.size()); i++) {
		tmp = value.substr(i,1);
		wchar_t tmpwc= *tmp.c_str();
		void *p = &amp;tmp;
		char *pc = (char *) p;
		char a1,b,c;

		a1 = tmp[0];
		b = tmp[1];

//		c = tmp._Ptr;   // hier steht es drin, leider kein Zugriff

		a[i*2] = *pc;  		a[i*2+1] = *(pc+sizeof (char));
		a1 = a[i*2]; b = a[i*2+1];
	}
	fs16.write(a,value.size() * sizeof (unsigned short));
</code></pre>
<p>im wchar sind die Bytes noch richtig drin, wie bekomme ich sie einzeln heraus ?</p>
<p>oder wie kann ich die Adresse bekommen ab der die Bytes im wstring gespeichert sind ?</p>
<p>Viel</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/152414/die-bytes-aus-einem-wstring-auslesen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 04:32:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/152414.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Jul 2006 08:13:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to die Bytes aus einem wstring auslesen on Thu, 06 Jul 2006 08:13:09 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich möchte einen Unicodestring speichern und habe Probleme dabei.</p>
<p>Mit folgenden Konstrukt bekomme ich eine Datei hin die<br />
erstmal die BOMn enthält.</p>
<pre><code class="language-cpp">vector&lt;unsigned short&gt; text16;
    text16.push_back(0xfeff); // bom

    ofstream fs16(&quot;c:/utf16.txt&quot;, ios_base::out | ios_base::binary);
    fs16.write(reinterpret_cast&lt;const char*&gt;(&amp;text16[0]), text16.size() * sizeof (unsigned short));
</code></pre>
<p>jetzt habe ich eine Klasse die von std::wstring erbt<br />
und wollte gern einen String in die Datei speichern.<br />
Leider klappt das nicht.<br />
Beim Betrachten mit einem Hex-Editor stelle ich fest das das zweite Byte nicht<br />
korrekt gespeichert wird.</p>
<p>Beim Speichern mit folgendem Code</p>
<pre><code class="language-cpp">std::fstream ziel(&quot;c:/unicode.txt&quot;,ios_base::out|ios_base::binary);
char *pc = Global::Conv_pwc2pc(value);

// unicode Signatur
ziel &lt;&lt; std::hex;
ziel &lt;&lt; 0xFFFE;
ziel &lt;&lt; &quot;PC value: &quot; &lt;&lt; pc &lt;&lt; &quot;\n&quot;;
ziel &lt;&lt; &quot;RString value: &quot;;
ziel &lt;&lt; value ;
ziel &lt;&lt; &quot;\n&quot;;
ziel.close();
</code></pre>
<p>wird die Signatur nicht korrekt abgelegt, außerdem der RString<br />
weil der Operator &lt;&lt; so überladen ist das die Adresse an der der RString liegt ausgegeben wird.</p>
<p>Jetzt wollte ich die Bytes einzeln speichern, kann aber auf das zweite nicht korrekt zugreifen:</p>
<pre><code class="language-cpp">wstring tmp;
	char a[100];
	for (int i=0; i&lt;(value.size()); i++) {
		tmp = value.substr(i,1);
		wchar_t tmpwc= *tmp.c_str();
		void *p = &amp;tmp;
		char *pc = (char *) p;
		char a1,b,c;

		a1 = tmp[0];
		b = tmp[1];

//		c = tmp._Ptr;   // hier steht es drin, leider kein Zugriff

		a[i*2] = *pc;  		a[i*2+1] = *(pc+sizeof (char));
		a1 = a[i*2]; b = a[i*2+1];
	}
	fs16.write(a,value.size() * sizeof (unsigned short));
</code></pre>
<p>im wchar sind die Bytes noch richtig drin, wie bekomme ich sie einzeln heraus ?</p>
<p>oder wie kann ich die Adresse bekommen ab der die Bytes im wstring gespeichert sind ?</p>
<p>Viel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1092248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1092248</guid><dc:creator><![CDATA[Rufus]]></dc:creator><pubDate>Thu, 06 Jul 2006 08:13:09 GMT</pubDate></item><item><title><![CDATA[Reply to die Bytes aus einem wstring auslesen on Thu, 06 Jul 2006 09:29:17 GMT]]></title><description><![CDATA[<p>Rufus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">wstring tmp;
	char a[100];
	for (int i=0; i&lt;(value.size()); i++) {
		tmp = value.substr(i,1);
		wchar_t tmpwc= *tmp.c_str();
		void *p = &amp;tmp;
		char *pc = (char *) p;
		char a1,b,c;

		a1 = tmp[0];
		b = tmp[1];

//		c = tmp._Ptr;   // hier steht es drin, leider kein Zugriff

		a[i*2] = *pc;  		a[i*2+1] = *(pc+sizeof (char));
		a1 = a[i*2]; b = a[i*2+1];
	}
	fs16.write(a,value.size() * sizeof (unsigned short));
</code></pre>
</blockquote>
<p>was für eine vergewaltigung der sprache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1092313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1092313</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 06 Jul 2006 09:29:17 GMT</pubDate></item><item><title><![CDATA[Reply to die Bytes aus einem wstring auslesen on Thu, 06 Jul 2006 09:38:36 GMT]]></title><description><![CDATA[<p>ich habe es erstmal so gemacht:</p>
<pre><code class="language-cpp">// String der nur aus dem ersten Zeichen besteht
	wstring tmp;
	wchar_t tmpwc;

	// hier wird die Zeichenkette gespeichert
	char *b = new char[value.size()*2];
	for (int i=0; i&lt;(value.size()); i++) {
		tmp = value.substr(i,1);
		tmpwc= *tmp.c_str();
		b[i*2] = tmpwc;  		b[i*2+1] = tmpwc &gt;&gt; 8;
	}
	fs16.write(b,value.size() * sizeof (unsigned short));
	delete(b);
</code></pre>
<p>das muß aber auch noch besser gehen !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1092324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1092324</guid><dc:creator><![CDATA[Rufus]]></dc:creator><pubDate>Thu, 06 Jul 2006 09:38:36 GMT</pubDate></item><item><title><![CDATA[Reply to die Bytes aus einem wstring auslesen on Thu, 06 Jul 2006 10:33:04 GMT]]></title><description><![CDATA[<p>wieso verwendest du nicht einfach einen wfstream? und wie ist value definiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1092359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1092359</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 06 Jul 2006 10:33:04 GMT</pubDate></item><item><title><![CDATA[Reply to die Bytes aus einem wstring auslesen on Sun, 09 Jul 2006 11:06:36 GMT]]></title><description><![CDATA[<p>Rufus schrieb:</p>
<blockquote>
<p>das muß aber auch noch besser gehen !</p>
</blockquote>
<p>Geht es.<br />
Eine <a href="http://de.wikipedia.org/wiki/Byte_Order_Mark" rel="nofollow">BOM</a> ist nichts anderes als ein Zeichen; nämlich U+FEFF &quot;zero width no-break space&quot;.<br />
Und wenn Du dieses und einen wstring in ein File schreiben möchtest, so kannst Du das mit einen wofstream tun. Etwa so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;

int main()
{
    using namespace std;

    const wchar_t BOM = 0xfeff;     // Unicode-Zeichen &quot;zero width no-break space&quot;
    wofstream file( &quot;output.txt&quot; );
    wstring s = L&quot;Hello World&quot;;
    if( file &lt;&lt; BOM &lt;&lt; s )
    {
        cout &lt;&lt; &quot;alles Ok&quot; &lt;&lt; endl;
    }
    return 0;
}
</code></pre>
<p>In welcher Weise die Zeichen dann in Bytes umgewandelt werden ist Sache der Facette codecvt des unter dem ofwstream liegenden streambuf's.</p>
<p>GGf. kann man diese mit</p>
<pre><code class="language-cpp">file.rdbuf()-&gt;pubimbue( ... )
</code></pre>
<p>austauschen. Eine Facette für die Konvertierung nach UTF8 findet man z.B. <a href="http://www.boost.org/libs/serialization/doc/codecvt.html" rel="nofollow">hier</a>.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1094335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1094335</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 09 Jul 2006 11:06:36 GMT</pubDate></item></channel></rss>