<?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 mit Umlauten aus Datei]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich muss eine DBase Datei auslesen, welche im DOS Format 850 encodiert ist.<br />
Mein Programm hat die &quot;normale&quot; encodierung, dadurch werden Umlaute und Sonderzeichen nicht korrekt dargestellt.</p>
<p>Einlesen tue ich mit einem ifstream:</p>
<pre><code class="language-cpp">if(del != 26)// 26 == EOF
            {
                try{
                    //std::setlocale(LC_ALL,&quot;cp850&quot;);
                typedef std::codecvt_byname&lt;char, char, std::mbstate_t&gt; Cvt;
                in.imbue(std::locale(&quot;C&quot;));
                char *data = new char[length];
                in.read(data,length);
                if(del != '*')//only save undeleted data
                {
                    /*std::stringstream ss;
                    std::string temp;
                    ss.imbue(std::locale(&quot;iso_8859_1&quot;));
                    ss &lt;&lt; data;
                    temp = ss.str();
                    ss.clear();*/
                    tabledata.InsertDataField(std::string(subrecords[j].name),data);
                }
                delete[] data;
                }
                catch(std::exception&amp; e)
                {
                    wxMessageBox(e.what());
                    return;
                }
            }
</code></pre>
<p>Wie muss ich das jetzt korrekt anwenden?<br />
Bei jedem std::locale(&quot;CodePageName&quot;) fliegt jeweils eine exception.<br />
Wie lässt sich das korrekt convertieren?</p>
<p>phlox</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/233418/problem-mit-umlauten-aus-datei</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 20:24:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/233418.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 04 Feb 2009 13:33:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Umlauten aus Datei on Wed, 04 Feb 2009 17:57:14 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich muss eine DBase Datei auslesen, welche im DOS Format 850 encodiert ist.<br />
Mein Programm hat die &quot;normale&quot; encodierung, dadurch werden Umlaute und Sonderzeichen nicht korrekt dargestellt.</p>
<p>Einlesen tue ich mit einem ifstream:</p>
<pre><code class="language-cpp">if(del != 26)// 26 == EOF
            {
                try{
                    //std::setlocale(LC_ALL,&quot;cp850&quot;);
                typedef std::codecvt_byname&lt;char, char, std::mbstate_t&gt; Cvt;
                in.imbue(std::locale(&quot;C&quot;));
                char *data = new char[length];
                in.read(data,length);
                if(del != '*')//only save undeleted data
                {
                    /*std::stringstream ss;
                    std::string temp;
                    ss.imbue(std::locale(&quot;iso_8859_1&quot;));
                    ss &lt;&lt; data;
                    temp = ss.str();
                    ss.clear();*/
                    tabledata.InsertDataField(std::string(subrecords[j].name),data);
                }
                delete[] data;
                }
                catch(std::exception&amp; e)
                {
                    wxMessageBox(e.what());
                    return;
                }
            }
</code></pre>
<p>Wie muss ich das jetzt korrekt anwenden?<br />
Bei jedem std::locale(&quot;CodePageName&quot;) fliegt jeweils eine exception.<br />
Wie lässt sich das korrekt convertieren?</p>
<p>phlox</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657828</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Wed, 04 Feb 2009 17:57:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Umlauten aus Datei on Wed, 04 Feb 2009 20:50:49 GMT]]></title><description><![CDATA[<p>Hallo phlox,</p>
<p>da bleiben nur zwei Möglichkeiten - entweder <a href="http://www.dinkumware.com/manuals/?manual=compleat&amp;page=index_cvt.html" rel="nofollow">Code-Converter-Facette kaufen</a> oder selber schreiben. Ich habe sowas schon mal für die Ausgabe gemacht, damit mir in der DOS-Konsole nicht ständig die Sonderzeichen um die Ohren fliegen.<br />
Den Input für die Konvertierung von der <a href="http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC" rel="nofollow">MS-Codepage nach Unicode habe ich hier</a> gefunden.</p>
<p>Die Google-Code-Suche brachte leider nichts.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658152</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 04 Feb 2009 20:50:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Umlauten aus Datei on Thu, 05 Feb 2009 11:47:40 GMT]]></title><description><![CDATA[<p>Hm, interessant. Wie müsste ich das nun implementieren?<br />
Hab da ehrlich keine Ahnung, was ich wo überschreiben muss, um es möglichst konform zu machen.<br />
Ich brauchs ja gerade nicht nach unicode, obwohl die CodePage natürlich schon hilfreich ist.</p>
<p>Ich finde diese Seiten hier:<br />
<a href="http://www.cantrip.org/locale.html" rel="nofollow">http://www.cantrip.org/locale.html</a><br />
<a href="http://stdcxx.apache.org/doc/stdlibug/25-6.html" rel="nofollow">http://stdcxx.apache.org/doc/stdlibug/25-6.html</a></p>
<p>aber da steht auch nix, wo ich eine conversion implementieren müsste.</p>
<p>Hm, gehts vielleicht mit boost::iostream?<br />
<a href="http://www.boost.org/doc/libs/1_37_0/libs/iostreams/doc/index.html" rel="nofollow">http://www.boost.org/doc/libs/1_37_0/libs/iostreams/doc/index.html</a></p>
<p>da jemand Erfahrung?</p>
<p>phlox</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658387</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Thu, 05 Feb 2009 11:47:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Umlauten aus Datei on Thu, 05 Feb 2009 21:04:03 GMT]]></title><description><![CDATA[<p>Hallo phlox,</p>
<p>hinter den beiden ersten von Dir genannten Links wird gezeigt, wie man eine eigene Facette konstruiert. Was man hier benötigt ist eine Facette, die dem streambuf bereits bekannt ist.<br />
Das ist die std::codecvt. Sie ist für Codeconvertierung zuständig, genauer wird mit Ihrer Hilfe festgelegt, wie ein Zeichen als Folge von Bytes - z.B. in einer Datei - abgelegt wird. Im einfachsten Fall ist ein Byte aus der Datei ein Zeichen im streambuf - z.B. in Deinem Fall wenn Du von einem Zeichencode 850 nach einem 8Bit-Zeichen in Unicode (hier begrenzt auf die Code Charts <a href="http://www.unicode.org/charts/PDF/U0000.pdf" rel="nofollow">Basic Latin</a> und <a href="http://www.unicode.org/charts/PDF/U0080.pdf" rel="nofollow">Latin-1 Code Chart</a> wegen der 8Bit) konvertieren möchtest.<br />
Eine andere bekannte Konvertierung ist die von <a href="http://de.wikipedia.org/wiki/UTF-8" rel="nofollow">UTF8</a> bei der zwischen einem und vier Byte ein beliebiges Unicode-Zeichen repräsentieren.</p>
<p>Zur Implementierung - man leite von std::codecvt ab und überlade die Methode do_in, um aus Bytes (extern_type) Zeichen (intern_type) zu machen, also vom Device in den Streambuf (Input) bzw. do_out für die Konvertierung von Zeichen (intern_type) in eine Bytefolge (extern_type -&gt; Output).</p>
<pre><code class="language-cpp">#include &lt;locale&gt;

template&lt; typename T &gt;
class CodePage850 : public std::codecvt&lt; T, char, std::mbstate_t &gt;
{
protected:
    virtual result do_in( state_type&amp; ,
        const extern_type* from, const extern_type* from_end, const extern_type*&amp; from_next,
        intern_type* to, intern_type* to_limit, intern_type*&amp; to_next) const
    {
        for( ; to != to_limit &amp;&amp; from != from_end; ++to, ++from )
        {
            // hier ggf. *from (aus CodePage) in *to (UniCode meistens Latin-1) konvertieren
        }
        from_next = from;
        to_next = to;
        return ok;
    }
    virtual bool do_always_noconv() const { return false; } 
    virtual int do_encoding() const { return 1; } 
};
</code></pre>
<p>mit dem Überladen von do_always_noconv = false teilt man dem streambuf mit, dass eine Konvertierug stattfindet. Das do_encoding = 1 heißt, dass eine 1:1-Konvertierung stattfindet, das heißt der State (1.Parameter) wird nicht benötigt.</p>
<p>Anwendung:</p>
<pre><code class="language-cpp">ifstream in( &quot;input.txt&quot; );
    in.imbue( locale( in.getloc(), new CodePage850&lt; char &gt; ) );
</code></pre>
<p>Der Zeichentyp (hier char) muss mit dem Zeichentyp des Streams übereinstimmen, das ist der 'intern_type' in den beim Input konvertiert wird.</p>
<p>Bleibt noch zu erwähnen, dass zumindest die MS-Implementierungen der STL an dieser Stelle so buggy sind, dass es da nicht korrekt funktioniert. In den aktuellen Versionen VC8 und VC9 (express) funktioniert der Input nur mit wchar_t.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658753</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 05 Feb 2009 21:04:03 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Umlauten aus Datei on Fri, 06 Feb 2009 09:02:08 GMT]]></title><description><![CDATA[<p>Vielen dank. Ich verwende MinGW, und es läuft jetzt.</p>
<p>Meine implementation sieht so aus:</p>
<pre><code class="language-cpp">template&lt; typename T &gt;
class CodePage850 : public std::codecvt&lt; T, char, std::mbstate_t &gt;
{
    typedef std::mbstate_t state_type;
    typedef T intern_type;
    typedef char extern_type;

protected:
    virtual std::codecvt_base::result do_in( state_type&amp; ,
        const extern_type* from, const extern_type* from_end, const extern_type*&amp; from_next,
        intern_type* to, intern_type* to_limit, intern_type*&amp; to_next) const
    {
        for( ; to != to_limit &amp;&amp; from != from_end; ++to, ++from )
        {
            // hier ggf. *from (aus CodePage) in *to (UniCode meistens Latin-1) konvertieren
            switch(*from)
            {
                case 0x84:
                *to = 'ä';
                break;
                case 0x8e:
                *to = 'Ä';
                break;
                case 0x94:
                *to = 'ö';
                break;
                case 0x99:
                *to = 'Ö';
                break;
                case 0x81:
                *to = 'ü';
                case 0x9a:
                *to = 'Ü';
                break;
                case 0xe1:
                *to = 'ß';
                break;
                default:
                *to =*from;
            }
        }
        from_next = from;
        to_next = to;
        return std::codecvt_base::ok;
    }
    virtual bool do_always_noconv() const throw() { return false; }
    virtual int do_encoding() const throw() { return 1; }
};
</code></pre>
<p>Alle anderen Zeichen wurden ja schon vorher korrekt dargestellt, daher das *to = *from.</p>
<p>phlox</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658907</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Fri, 06 Feb 2009 09:02:08 GMT</pubDate></item></channel></rss>