Discussion:
String ins Unicode konvertieren
(zu alt für eine Antwort)
Andy Staats
2006-02-23 13:32:27 UTC
Permalink
Hallo NG'ler,

Hintergrund:
Ich programmiere eine Anwendung, welche auf eine Datenbank (Firebird
embedded) zurückgreift. Die auf die Datenbank zugreifende Funktion
(via ibpp) übergibt allerdings nur Strings zurück (via DLL-Datei,...)

Dieser schaut zum Beispiel so aus:
"デã,´ã,£ãƒˆãƒ,,ッ".

Das will ich nun ins Unicode-Format (das sind eigentlich chinesische
Zeichen) konvertieren und dann ausgeben.
Probiert habe ich es schonmal testweise via:

TCHAR test[30];
for(int i = 0; i < strlen(fn.c_str()); i++)
{
test[i] = (TCHAR) fn.c_str()[i];
}

Das funktioniert auch schon partiell ganz gut, aber es werden eben
nicht alle Zeichen richtig konvertiert, wohl weil meines Wissens nach
einige chinesische Zeichen mit nur 1 Byte kodiert sind (und die kann
ich supergut umwandeln), aber einige andere Zeichen mit bis zu 3 Byte
kodiert sind (und diese werden nun zerhackt).


Hat also jemand eine Idee, wie ich den String in ein Unicode-Char
(TCHAR?) umwandeln kann, damit ich wieder schöne chinesische Zeichen
habe? :(

Ich bin da gerade ratlos... Vielen Dank und viele Grüße,

Andy Staats
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+***@bud.prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-***@bud.prima.de
Dietmar Kuehl
2006-02-23 14:59:52 UTC
Permalink
Post by Andy Staats
Die auf die Datenbank zugreifende Funktion
(via ibpp) übergibt allerdings nur Strings zurück
Im ersten Schritt sollte man sich darüber klar werden,
was in der Datenbank gespeichert wird bzw. gespeichert
werden soll. Wenn der Datentyp sowas wie 'char*' bzw.
'std::string' ist, dann handelt es sich bei der Verwendung
von Unicode sicher nicht um Sequenzen von Zeichen, sondern
um Sequenzen von Bytes. Der wesentliche Unterschied ist,
dass die Bytes ein Encoding einer Sequenz von Zeichen
darstellen, aber selbst nicht direkt Zeichen sind. Um
zwischen Byte- und Zeichensequenzen zu konvertieren, muß
man diese halt decodieren bzw. encodieren, je nachdem, in
welche Richtung die Zeichen bewegt werden.
Post by Andy Staats
Das will ich nun ins Unicode-Format (das sind eigentlich chinesische
Zeichen) konvertieren und dann ausgeben.
Ich bin kein Unicode-Experte, aber "Unicode-Format"
erscheint mir ein falscher Begriff zu sein: Unicode
spezifiziert primär die Interpretation von Werten als
Zeichen und ist eigentlich selbst auch ein Encoding, halt
eins für 20 Bit Einheiten. Daneben definiert Unicode noch
ein paar spezifische Encodings für Unicode-Zeichen, etwa
UTF-8, UTF-16 und UCS4 (letzter ist eine geeignete interne
Darstellung von Unicode-Zeichen, obwohl often UCS2 verwendet
wird, was aber natürlich nicht alle Unicode-Zeichen darstellen
kann).

Wenn man Sequenzen von Zeichen in einer Datenbank ablegen
will, diese aber keine Unicode-Zeichen versteht und selbst
passend codiert, dann muß man halt die Codierung/Decodierung
selbst machen, etwa indem man die Unicode-Zeichen mittels
UTF-8 codiert und das Resultat als Byte-Folge ablegt.
Post by Andy Staats
TCHAR test[30];
for(int i = 0; i < strlen(fn.c_str()); i++)
{
test[i] = (TCHAR) fn.c_str()[i];
}
Für diesen Code sollte man Programmierer fristlos entlassen
können! Sowas darf man nicht mal als kleines Demo schreiben!

Insbesondere im Kontext von Encodings kann es schon mal
vorkommen, dass ein Byte den Wert Null hat, was aber noch
lange nicht signalisiert, dass der String dort zu Ende ist.
Sicher, bei Verwendung von UTF-8 wird das Null-Byte nicht
explizit verwendet, aber bei anderen Encodings, etwa UTF-16,
sehr wohl. Wenn man von diesem semantischen Problem absieht,
bleibt natürlich noch das Performance-Problem, dass man sich
mit der wiederholten Verwendung von 'strlen()' sichert: Was
spricht gegen die Verwendung von 'fn.size()'?

Damit kommen wir natürlich direkt zu dem nächsten semantischen
Problem, nämlich der Einladung für einen Buffer-Overflow: es
ist nur Platz für 30 Zeichen. Das heißt, der Ausdruck für den
Schleifenabbruch muß auch berücksichtigen, dass nur Platz für
maximal 30 Zeichen ist:

for (std::string::size_type i = 0, end = std::min(30, fn.size());
i < end; ++i)

... und der Ausdruck 'fn.c_str()[i]' mag ja nett gemeint sein,
aber ist ggf. auch deutlich ineffizienter als 'fn[i]', hat aber
trotzdem semantisch das gleich Ergebnis.
Post by Andy Staats
Das funktioniert auch schon partiell ganz gut,
Falsch! Das funktioniert garnicht bzw. dort wo es zu funktionieren
scheint nur aus Zufall. Wenn die Bytes etwa UTF-8 enthalten, dann
werden alle ASCII-Zeichen richtig dargstellt, der Rest allerdings
nicht. Was notwendig ist, ist das externe Encoding (vermutlich
UTF-8) in ein internes Encoding ("Unicode", was auf Windows
typischerweise UCS2 bzw., wenn man es richtig machen wollte
und/oder könnte, UTF-16 bedeutet) zu wandeln. Dazu kann man z.B.
die 'std::codecvt<...>'-Facets verwenden, wobei die nicht so
richtig leicht zu verwenden sind.
Post by Andy Staats
aber es werden eben
nicht alle Zeichen richtig konvertiert, wohl weil meines Wissens nach
einige chinesische Zeichen mit nur 1 Byte kodiert sind (und die kann
ich supergut umwandeln), aber einige andere Zeichen mit bis zu 3 Byte
kodiert sind (und diese werden nun zerhackt).
Wenn das externe Encoding UTF-8 ist, dann kann ein Zeichen mit
bis zu 6 Bytes dargestellt werden. Dabei enthält das erste
Byte eine Art Zähler, aus wievielen Bytes ein Zeichen besteht
und ggf. die ersten Bits. Etwa so (dargestellt ist der relevant
Anfang des Bytes; Datenbits als Punkte):
- 0....... => ein Byte: ASCII Zeichen
- 10...... => Continuation Byte: nie erstes Byte, 6 Datenbits
- 110..... => ein weiteres Byte, plus 5 Daten Bits
- 1110.... => zwei weitere Bytes, plus 4 Daten Bits
- 11110... => drei weitere Bytes, plus 3 Daten Bits
- ...
Post by Andy Staats
Hat also jemand eine Idee, wie ich den String in ein Unicode-Char
(TCHAR?) umwandeln kann, damit ich wieder schöne chinesische Zeichen
habe? :(
BTW, was ist "TCHAR"? Ich habe im C++ Standard geguckt und
nichts passendes gefunden... Zumindest im Kontext dieser
Newsgroup meintest Du vermutlich 'wchar_t', welches allerdings
auf einigen Plattformen (etwa Windows) nicht mit einer
sinnvollen Größe dargestellt wird: auf Windows hat 'wchar_t'
nur 16 Bit, Unicode-Zeichen allerdings 20 Bit, was dazu führt,
dass die meisten Programme davon ausgehen, dass UCS2 eine
geeignete Darstellung bei der Verarbeitung von Unicode-Zeichen
ist.
--
<mailto:***@yahoo.com> <http://www.dietmar-kuehl.de/>
<http://www.eai-systems.com> - Efficient Artificial Intelligence
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+***@bud.prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-***@bud.prima.de
Thomas Maeder
2006-02-23 18:06:58 UTC
Permalink
Post by Dietmar Kuehl
BTW, was ist "TCHAR"?
Das ist ein auf Windows oft anzutreffendes typedef. Je nachdem, ob ein
bestimmter Makro (ich glaube _UNICODE) definiert ist oder nicht, steht
TCHAR für char oder wchar_t.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+***@bud.prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-***@bud.prima.de
Andy Staats
2006-02-24 07:41:41 UTC
Permalink
Hallo Dietmar,

vielen Dank für deine ausführlich Antwort!
Post by Dietmar Kuehl
Im ersten Schritt sollte man sich darüber klar werden,
was in der Datenbank gespeichert wird bzw. gespeichert
werden soll.
Momentan wird es als Unicode UTF-8 (bzw. das nennt die
Firebird-Datenbank intern UNICODE_FSS) in einem VARCHAR-Feld abgelegt.
Ich habe ehrlich gesagt noch nicht mit verschiedenen Zeichensätzen
gearbeitet, bin auf diesem Gebiet also neu und muss mich da langsam
rantasten, da jetzt japanische Zeichen gebraucht werden.
Post by Dietmar Kuehl
Wenn der Datentyp sowas wie 'char*' bzw.
'std::string' ist, dann handelt es sich bei der Verwendung
von Unicode sicher nicht um Sequenzen von Zeichen, sondern
um Sequenzen von Bytes.
Ja - das erscheint mir so. Jedenfalls überträgt meine Anwendung die
Daten in einene std::string.
Post by Dietmar Kuehl
Wenn man Sequenzen von Zeichen in einer Datenbank ablegen
will, diese aber keine Unicode-Zeichen versteht und selbst
passend codiert,
Doch - die Datenbank unterstützt Unicode...
Post by Dietmar Kuehl
dann muß man halt die Codierung/Decodierung
selbst machen, etwa indem man die Unicode-Zeichen mittels
UTF-8 codiert und das Resultat als Byte-Folge ablegt.
Das wäre natürlich auch noch eine Idee, dadurch würde es vielleicht
universeller einsetzbar sein.
Post by Dietmar Kuehl
Post by Andy Staats
TCHAR test[30];
for(int i = 0; i < strlen(fn.c_str()); i++)
{
test[i] = (TCHAR) fn.c_str()[i];
}
Für diesen Code sollte man Programmierer fristlos entlassen
können!
Wie gut, dass ich hier nur Praktikant bin. ;)
Post by Dietmar Kuehl
for (std::string::size_type i = 0, end = std::min(30, fn.size());
i < end; ++i)
Danke für die ausführliche Erläuterung! Ich sehe ja längst ein,
dass mein Quelltextausschnitt sehr schlecht war, aber es war ja auch
nur ein Entwurf zum schnellen Testen.
Post by Dietmar Kuehl
Wenn das externe Encoding UTF-8 ist, dann kann ein Zeichen mit
bis zu 6 Bytes dargestellt werden. Dabei enthält das erste
Byte eine Art Zähler, aus wievielen Bytes ein Zeichen besteht
und ggf. die ersten Bits. Etwa so (dargestellt ist der relevant
- 0....... => ein Byte: ASCII Zeichen
- 10...... => Continuation Byte: nie erstes Byte, 6 Datenbits
- 110..... => ein weiteres Byte, plus 5 Daten Bits
- 1110.... => zwei weitere Bytes, plus 4 Daten Bits
- 11110... => drei weitere Bytes, plus 3 Daten Bits
Aha... wieder etwas dazugelernt.
Post by Dietmar Kuehl
BTW, was ist "TCHAR"? Ich habe im C++ Standard geguckt und
nichts passendes gefunden... Zumindest im Kontext dieser
Newsgroup meintest Du vermutlich 'wchar_t',
Sorry, ich hatte da wohl einfach etwas nicht ISO-C++-Konformes
genommen... Das MS Visual Studio verleitet schnell zu so etwas..

Vielen Dank für dein Posting,
du hast mir ein Stückchen weitergeholfen.

Andy
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+***@bud.prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-***@bud.prima.de
Daniel Albuschat
2006-02-24 12:57:08 UTC
Permalink
Post by Andy Staats
Hallo Dietmar,
vielen Dank für deine ausführlich Antwort!
Post by Dietmar Kuehl
Im ersten Schritt sollte man sich darüber klar werden,
was in der Datenbank gespeichert wird bzw. gespeichert
werden soll.
Momentan wird es als Unicode UTF-8 (bzw. das nennt die
Firebird-Datenbank intern UNICODE_FSS) in einem VARCHAR-Feld abgelegt.
Ich habe ehrlich gesagt noch nicht mit verschiedenen Zeichensätzen
gearbeitet, bin auf diesem Gebiet also neu und muss mich da langsam
rantasten, da jetzt japanische Zeichen gebraucht werden.
Hi,
Ich hatte dir eine E-Mail geschrieben, weil es in der Newsgroup
hier Off-Topic ist. Vielleicht hast du sie nicht erhalten.
Wie dem auch sei:
Firebird unterstuetzt *kein* UTF-8. UNICODE_FSS basiert auf einem
Stand des UTF-8 Designs vor der Standardisierung und es wird generell
davon abgeraten, es zu benutzen.

Die bessere Variante waere, 'character set none' zu benutzen und
sich selbst um die Kodierung zu kuemmern.
Abgesehen davon sieht das, was du gepostet hast, nicht nach UTF-8
aus. Ob es BIG-5 ist, weiss ich nicht genau... wenn BIG-5 aehnlich
iso-2022-jp ist, ist es das jedoch auch nicht. :)
Post by Andy Staats
Post by Dietmar Kuehl
Wenn der Datentyp sowas wie 'char*' bzw.
'std::string' ist, dann handelt es sich bei der Verwendung
von Unicode sicher nicht um Sequenzen von Zeichen, sondern
um Sequenzen von Bytes.
Ja - das erscheint mir so. Jedenfalls überträgt meine Anwendung die
Daten in einene std::string.
std::string wird hier nur als vector<char> {mis,ge}braucht.
Post by Andy Staats
Post by Dietmar Kuehl
Wenn man Sequenzen von Zeichen in einer Datenbank ablegen
will, diese aber keine Unicode-Zeichen versteht und selbst
passend codiert,
Doch - die Datenbank unterstützt Unicode...
Siehe oben.
Post by Andy Staats
Post by Dietmar Kuehl
dann muß man halt die Codierung/Decodierung
selbst machen, etwa indem man die Unicode-Zeichen mittels
UTF-8 codiert und das Resultat als Byte-Folge ablegt.
Das birgt das Problem, dass die Sortier- und Filterfunktion
der DB dadurch sabotiert wird. In Firebird gibt es, ausser
eine Codepage zu verwenden, leider keine andere Moeglichkeit,
weil Firebird kein richtiges UTF-8 kann.
Post by Andy Staats
Das wäre natürlich auch noch eine Idee, dadurch würde es vielleicht
universeller einsetzbar sein.
Post by Dietmar Kuehl
Post by Andy Staats
TCHAR test[30];
for(int i = 0; i < strlen(fn.c_str()); i++)
{
test[i] = (TCHAR) fn.c_str()[i];
}
Für diesen Code sollte man Programmierer fristlos entlassen
können!
Da wir sowieso schon off-topic sind:
Auf http://thedailywtf.com habe ich schon viel schlimmeres gesehen. :)

MfG,
Daniel Albuschat
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+***@bud.prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-***@bud.prima.de
Andy Staats
2006-02-24 13:22:30 UTC
Permalink
Post by Daniel Albuschat
Ich hatte dir eine E-Mail geschrieben, weil es in der Newsgroup
hier Off-Topic ist. Vielleicht hast du sie nicht erhalten.
Tut mir leid, hier auf der Arbeit habe ich keinen Zugriff auf meine
privaten Mailaccounts und mit meiner Firmen-Email-Adresse möchte ich
aus Spamgründen nicht posten. :(
Vielen Dank an dich, dass du es hier nocheinmal gepostet hast!
Post by Daniel Albuschat
Firebird unterstuetzt *kein* UTF-8. UNICODE_FSS basiert auf einem
Stand des UTF-8 Designs vor der Standardisierung und es wird generell
davon abgeraten, es zu benutzen.
Achso? Dann hatte ich das wohl falsch gelesen... :-/
Post by Daniel Albuschat
Die bessere Variante waere, 'character set none' zu benutzen und
sich selbst um die Kodierung zu kuemmern.
Schade, dass es nicht so schön einfach geht.. :(
Post by Daniel Albuschat
Abgesehen davon sieht das, was du gepostet hast, nicht nach UTF-8
aus. Ob es BIG-5 ist, weiss ich nicht genau... wenn BIG-5 aehnlich
iso-2022-jp ist, ist es das jedoch auch nicht. :)
Ich kenne mich eigentlich mit japanischen Schriftzeichen nicht aus,
aber die Produktbezeichnungen sollen beispielsweise auch in dieser
fernöstlicher Sprache eingepflegt werden.
Ich habe keine Ahnung, was das Tool "IBExpert" dann da reingeschrieben
hat.. :-/
Post by Daniel Albuschat
Post by Andy Staats
Doch - die Datenbank unterstützt Unicode...
Siehe oben.
Sorry. ;)
Post by Daniel Albuschat
Das birgt das Problem, dass die Sortier- und Filterfunktion
der DB dadurch sabotiert wird.
Das würde meines jetzigen Request- und Kenntnisstandes kein Problem
darstellen, da die Einträge in der Datenbank nicht nach diesen
japanischen Zeichen durchsuchen muss, man musss halt einfach nur zum
Beispiel das Wort, was hinter ID = 1 steht, ausgeben können.
Post by Daniel Albuschat
Auf http://thedailywtf.com habe ich schon viel schlimmeres gesehen. :)
*hehe* Das werde ich mir mal nach Feierabend durchlesen. ;)

Vielen Dank für deinen netten Beitrag,
Grüße aus Stuttgart,

Andy
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+***@bud.prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-***@bud.prima.de
Heinz Ozwirk
2006-02-23 16:00:11 UTC
Permalink
Post by Andy Staats
Hallo NG'ler,
Ich programmiere eine Anwendung, welche auf eine Datenbank (Firebird
embedded) zurückgreift. Die auf die Datenbank zugreifende Funktion
(via ibpp) übergibt allerdings nur Strings zurück (via DLL-Datei,...)
"ãf?ã,Žã,£ãf^ãf,,ãff".
Das will ich nun ins Unicode-Format (das sind eigentlich chinesische
Zeichen) konvertieren und dann ausgeben.
TCHAR test[30];
for(int i = 0; i < strlen(fn.c_str()); i++)
{
test[i] = (TCHAR) fn.c_str()[i];
}
Das funktioniert auch schon partiell ganz gut, aber es werden eben
nicht alle Zeichen richtig konvertiert, wohl weil meines Wissens nach
einige chinesische Zeichen mit nur 1 Byte kodiert sind (und die kann
ich supergut umwandeln), aber einige andere Zeichen mit bis zu 3 Byte
kodiert sind (und diese werden nun zerhackt).
Hat also jemand eine Idee, wie ich den String in ein Unicode-Char
(TCHAR?) umwandeln kann, damit ich wieder schöne chinesische Zeichen
habe? :(
Einfache Casts sind keine Lösung, und nicht näher spezifizierte Datentypen
wie TCHAR auch nicht. Außerdem sollte man etwas mehr über die Art der
Strings wissen. Sind es Unicode Strings (scheinbar nicht, sonst bräuchte man
ja nicht konvertieren) oder MBCS Strings, dann wäre es sehr hilfreich, wenn
man wüsste um welchen MBCS es sich handelt. (Codepage). Da vieles auf
Windows hindeutet, kann ich nur vorschlagen, mal etwas über
MultiByteToWideChar zu lesen und in diesem Zusammenhang TCHAR auch
wenigstens vorübergehend zu vergessen.

Mehr kann ich aus den spärlichen Informationen leider nicht schließen.
Wichtig zu wissen wäre vor allem die Art der Strings, die die Datenbank
liefert und da besonders den Datentyp und den verwendeten
Zeichensatz/Codepage.

HTH
Heinz
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+***@bud.prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-***@bud.prima.de
Andy Staats
2006-02-24 07:50:13 UTC
Permalink
Hallo,
Post by Heinz Ozwirk
Außerdem sollte man etwas mehr über die Art der
Strings wissen. Sind es Unicode Strings (scheinbar nicht, sonst bräuchte man
ja nicht konvertieren)
Es sind std:strings, die ich in meine Anwendung übergeben bekomme.
Post by Heinz Ozwirk
oder MBCS Strings, dann wäre es sehr hilfreich, wenn
man wüsste um welchen MBCS es sich handelt. (Codepage).
Bisher habe ich leider nur
http://www.destructor.de/firebird/charsets.htm
gefunden.

Das heißt, in der Datenbank stehen UNICODE_FSS bzw. UTF-8. Die
Schnittstelle zur Datenbank ( http://www.ibpp.org ) übergibt diese
Felder allerdings "nur" in std:strings weiter (und in diesen steht dann
Zeichensalat).
Post by Heinz Ozwirk
Da vieles auf Windows hindeutet
Ja - das ganze soll unter Windows bzw. MS Visual Studio 2003 C++
laufen.
Post by Heinz Ozwirk
MultiByteToWideChar
Das hatte ich auch schon gefunden, damit werde ich mich wohl nochmal
näher auseinander setzten.
Post by Heinz Ozwirk
Wichtig zu wissen wäre vor allem die Art der Strings, die die Datenbank
liefert
Wie gesagt: In der DB steht UTF-8, aber die Datenbankschnittstelle
liefert nur std:strings.

Vielen Dank!

Andy
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+***@bud.prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-***@bud.prima.de
Bob Hairgrove
2006-02-24 11:34:08 UTC
Permalink
On 23 Feb 2006 23:50:13 -0800, "Andy Staats"
Post by Andy Staats
Post by Heinz Ozwirk
MultiByteToWideChar
Das hatte ich auch schon gefunden, damit werde ich mich wohl nochmal
näher auseinander setzten.
Meistens gibt es ein Datenbank-Parameter, das über die Art der
Zeichensatz-Kodierung bzw. das "Locale" der Sprache etwas aussagt ...
es gibt nämlich viele verschiedene Arten von Chinesisch-Kodierungen.

Wie jemand anderswo in diesem Thread geschrieben hat, ist wchar_t auf
Windows evtl. gar nicht gross genug, bestimmte Unicode-Zeichensätze
aufzunehmen. Man kann es allerdings mit MultiByteToWideChar probieren,
in dem man für das Argument "CodePage" die von Windows vordefinierte
Konstante CP_UTF8 übergibt.

Sehr wichtig ist es, die Funktion zweimal aufzurufen: das erste Mal
sollte das Argument "cchWideChar" == 0 sein, um herauszufinden, wie
gross der Buffer sein muss, dann das 2. Mal mit den relevanten
Parametern, nachdem man zwischen den zwei Aufrufen einen genügend
grossen Buffer bereitgestellt hat. Ausserdem sollte man die
Rückgabewerte beide Male auf Fehlercodes auswerten. Falls die
Konvertierung schiefgeht, gibt die Funktion 0 zurück. Dann muss man
GetLastError aufrufen, um herauszufinden, warum.

Falls es nicht geht, würde ich die plattform-unabhängige
Unicode-Bibliothek ICU von IBM empfehlen. Sie ist "open source" und
wurde für verschiedene Programmiersprachen implementiert.

--
Bob Hairgrove
***@Home.com
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+***@bud.prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-***@bud.prima.de
Sergio Pereira
2006-02-24 09:32:17 UTC
Permalink
"デã,´ã,£ãƒˆãƒ,,ッ".
Ich glaube du solltest erst mal schauen wie diese Zeichen kodiert worden
sind. Dabei kann sicher dieser Wiki Artikel helfen:
http://de.wikipedia.org/wiki/UTF

Gruss
Sergio
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+***@bud.prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-***@bud.prima.de
Tilman Kuepper
2006-02-24 11:34:48 UTC
Permalink
Hallo Andy,
Post by Andy Staats
Hat also jemand eine Idee, wie ich den String in
ein Unicode-Char (TCHAR?) umwandeln kann, damit
ich wieder schöne chinesische Zeichen habe? :(
In den anderen Artikeln hast du geschrieben, dass
in der Datenbank die Texte in UTF-8-Codierung
vorliegen. Ueber Unicode und UTF-8 findest du
unter www.unicode.org viele Infos. Und auch hier:
http://www.cl.cam.ac.uk/~mgk25/unicode.html

Zum Einlesen von UTF-8-Daten mit C++ (bzw. zur
Umwandlung der Daten in std::wstring-Zeichenketten
koennen zum Beispiel sog. Codecvt-Facetten verwendet
werden, das hat Dietmar ja bereits geschrieben. Im
C++ User Journal hat PJ Plauger im April/Mai 1999
zwei Artikel zu diesem Thema veroeffentlicht. Der
Quellcode ist im Netz verfuegbar:

http://www.cuj.com/code/

Alternativ kann man auch einen konvertierenden
Stream-Buffer implementieren. Ich habe das selbst
einmal gemacht; das Resultat findest du hier:

ftp://ftp.cuj.com/pub/2005/cujmar2005.zip

In dieser ZIP-Datei ist eine weitere ZIP-Datei
"Kuepper.zip", da steckt dann der Quellcode drin.
Der Konverter wandelt zwischen UTF-8 (extern) und
UTF-32 (intern).

Viel Erfolg!
Tilman
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+***@bud.prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-***@bud.prima.de
Loading...