Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

cp1252 nach utf8 converter

30 views
Skip to first unread message

Michael Schuster

unread,
Feb 10, 2010, 9:50:45 AM2/10/10
to
Hallo,
ich bin hier mit dem folgendem Problem beschᅵftigt:
Ich mᅵchte eine Ausgabestream in ein anderes Systemcoding umwandeln. Mein
System (linux, gcc) liest uft-8 aber ich mᅵchte cp1252 erzeugen.
Ich wollte das mit der boost bzw mit imbue des Streams machen, aber so recht
weiss ich nicht, wie ich auf ein Set fᅵr die cp1252
So geht das ja im Prinzip:

locale lUTF(locale(),new utf8_codecvt_facet());
ifstream in;
in.imbue(lUTF);

Aber wie mache ich das mit cp1252?
Danke fᅵr Hinweise

Michael
--
Remove the sport from my address to obtain email
www.enertex.de - Innovative Systemlᅵsungen der Energie- und Elektrotechnik

Markus Raab

unread,
Feb 13, 2010, 11:34:18 AM2/13/10
to
Michael Schuster wrote:

> locale lUTF(locale(),new utf8_codecvt_facet());
> ifstream in;
> in.imbue(lUTF);
>
> Aber wie mache ich das mit cp1252?
> Danke fᅵr Hinweise

Ich glaube nicht, dass cp1252 irgendwo im C++ Standard vorkommt, deswegen
denke ich, dass es mit ISO C++ nicht gehen wird.

Ideen es trotzdem zu lᅵsen wᅵren:

Mit glib: Glib::convert(_stream.str(), "CP1252", "UTF-8");

ICU, bzw. das Binding Boost::Locale (siehe "Code-page conversions"
http://cppcms.sourceforge.net/boost_locale/docs/index.html).

Oder kannst du dir deine Locale auf etwas was cp1252 verwendet umstellen?

mfg Markus

--
http://www.markus-raab.org | Demokratie ist Diskussion. -- Th. G.
-o) | Masaryk
Kernel 2.6.24-1-a /\ |
on a x86_64 _\_v |

James Kanze

unread,
Feb 14, 2010, 6:34:01 AM2/14/10
to
On Feb 13, 4:34 pm, Markus Raab <use...@markus-raab.org> wrote:
> Michael Schuster wrote:
> > locale lUTF(locale(),new utf8_codecvt_facet());
> > ifstream in;
> > in.imbue(lUTF);

> > Aber wie mache ich das mit cp1252?

> > Danke für Hinweise

> Ich glaube nicht, dass cp1252 irgendwo im C++ Standard
> vorkommt, deswegen denke ich, dass es mit ISO C++ nicht gehen
> wird.

UTF-8 kommt auch im aktuellen Standard nicht vor. C++ bietet
standardmäßig keine Unterstützung bestimmter Kodierungen an. Nur
ein Framework, die für alle mehr oder weniger gehen soll, das
die Implementierung unterstützen will.

Wahrscheinlich muss er mit wchar_t arbeiten; CP1252 ist eine
Einzelbyte-Kodierung, und die Locale für Einzelbyte-Kodierungen
gehen fast immer davon aus, dass dieselbe Kodierung intern für
char benutzt wird, und machen keine Umwandlung
(codecvt<char>::always_noconv() liefert true zurück).

> Ideen es trotzdem zu lösen wären:

> Mit glib: Glib::convert(_stream.str(), "CP1252", "UTF-8");

> ICU, bzw. das Binding Boost::Locale (siehe "Code-page
> conversions"http://cppcms.sourceforge.net/boost_locale/docs/index.html).

In anderen Worten, Boost bietet Locale an, die sich auf
Glib::convert basieren. Eine sehr nette Lösung.

> Oder kannst du dir deine Locale auf etwas was cp1252 verwendet
> umstellen?

Ob der benötige Locale auf seinem Rechner vorhanden ist, und wie
es heißt, und wenn nicht, woher er ihn bekommen kann, sind die
richtigen Fragen. Unter Windows hat er ihn ("German_Germany.1252",
oder so was ähnlich). Under Unix wäre der Name "de_DE.1252",
oder etwas ähnlich; ich habe ihn aber unter Unix nie gesehen
(freilich aber auch nie gesucht). Amsonsten gibt es Boost, und
vielleicht auch andere. (Auch: CP 1252 ist ISO 8859-1 sehr
ähnlich. Möglicherweise kommt er zurecht mit "de_DE.iso8859-1".
Falls keine Euro-Zeichen vorkommt, mindestens.)

--
James Kanze

Andreas Huennebeck

unread,
Feb 15, 2010, 3:41:58 AM2/15/10
to
Michael Schuster wrote:

> Ich mᅵchte eine Ausgabestream in ein anderes Systemcoding umwandeln. Mein
> System (linux, gcc) liest uft-8 aber ich mᅵchte cp1252 erzeugen.
> Ich wollte das mit der boost bzw mit imbue des Streams machen, aber so
> recht weiss ich nicht, wie ich auf ein Set fᅵr die cp1252
> So geht das ja im Prinzip:
>
> locale lUTF(locale(),new utf8_codecvt_facet());
> ifstream in;
> in.imbue(lUTF);
>
> Aber wie mache ich das mit cp1252?

Direkte Hilfe kann ich nicht bieten, aber schau Dir mal den Sourcecode
von 'iconv' an, das kann auch CP1252 ( jedenfalls bei mir unter
Centos 5.2: 'iiconf --list' zeigt alle interstᅵtzen Codings).

Tschau
Andreas
--
Andreas Hᅵnnebeck | email: ac...@gmx.de
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
PGP-Key: http://www.huennebeck-online.de/public_keys/pgp_andreas.asc

Markus Raab

unread,
Feb 15, 2010, 11:30:39 AM2/15/10
to
Hallo!

James Kanze wrote:
>> Mit glib: Glib::convert(_stream.str(), "CP1252", "UTF-8");
>
>> ICU, bzw. das Binding Boost::Locale (siehe "Code-page
>> conversions"http://cppcms.sourceforge.net/boost_locale/docs/index.html).
>
> In anderen Worten, Boost bietet Locale an, die sich auf

> Glib::convert basieren. ᅵEine sehr nette Lᅵsung.

Das war vielleicht unklar ausgedrᅵckt, ich habe zwei verschiedene Lᅵsungen
beschrieben:
1.) glibmm, welches Glib verwendet
2.) boost::locale, welches ICU verwendet

mfg Markus

--
http://www.markus-raab.org | "wenn sich die farben irgendwo brechen,
-o) | dann brechen sie sich eben und irgendwann
Kernel 2.6.24-1-a /\ | koen sie in die ozschicht, wo das licht
on a x86_64 _\_v | blau wird" -- Barbara

0 new messages