Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Compiler- und IDE-Forum ::  VisialStudio: MultiByte vs Unicode  
Gehen Sie zu Seite Zurück  1, 2, 3, 4  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
xor
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.03.2010
Beiträge: 58
Beitrag xor Mitglied 20:03:15 02.09.2010   Titel:              Zitieren

Also die technische Erklärung ist einfach: std::string ist ein std::basic_string<char> und std::wstring ist ein std::basic_string<wchar_t>. Und damit kann ein std::string nur mit char umgehen während ein std::wstring nur mit wchar_t umgehen kann ;)

Ich mache daher meist folgendes
C/C++ Code:
#if defined(UNICODE) || defined(_UNICODE)
#  define
tstring wstring
#else
#  define
tstring string
#endif
C/C++ Code:
#if defined(UNICODE) || defined(_UNICODE)
# define
tstring wstring
#else
# define
tstring string
#endif
C/C++ Code:
#if defined(UNICODE) || defined(_UNICODE)
#  define
tstring wstring
#else
#  define
tstring string
#endif


Im Projekt benutze ich dann immer den "tstring" und das _T - Makro.

PS: Man kann sich aber auch eine eigene String-Klasse schreiben, wo die Methoden entsprechend überladen sind und dann MultiByteToWideChar / WideCharToMultiByte einsetzen :D
Der_Knob
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.05.2001
Beiträge: 580
Beitrag Der_Knob Mitglied 22:53:32 02.09.2010   Titel:              Zitieren

mh, ne eigene Klasse klingt jetzt aber auch nicht gerade reizvoll
Also muss ich überall die Makros verwenden?

Was für eins ist da jetzt besser? L oder _T?

_________________
sally - because we love music
* www.sally-project.org *


Zuletzt bearbeitet von Der_Knob am 22:55:06 02.09.2010, insgesamt 1-mal bearbeitet
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 7252
Beitrag Dravere Moderator 23:49:42 02.09.2010   Titel:              Zitieren

Der_Knob schrieb:
Was für eins ist da jetzt besser? L oder _T?

L ist kein Makro, sondern ein Sprachteil von Standard C++. L sagt dem Kompiler, dass das Stringliteral ein Widestring darstellen soll. Also in Code:
C/C++ Code:
char const* c = "hello"; // ist ein char[6]
wchar_t const* w = L"hello"; // ist ein wchar_t[6]
C/C++ Code:
char const* c = "hello"; // ist ein char[6]
wchar_t const* w = L"hello"; // ist ein wchar_t[6]
C/C++ Code:
char const* c = "hello"; // ist ein char[6]
wchar_t const* w = L"hello"; // ist ein wchar_t[6]

_T ist ein Kompilerabhängiges Makro und nicht Teil von Standard C++. Das Makro _T ist unter MSVC ca. wie folgt definiert:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
#if defined(UNICODE)
# define
_T(x) L ## x
#else
# define
_T(X) x
#endif


// Wenn UNICODE gesetzt ist, expandiert folgender Ausdruck:
_T("hello")
// zu
L"hello"
// Falls UNICODE nicht gesetzt ist, dann wird daraus:
"hello"
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
#if defined(UNICODE)
# define
_T(x) L ## x
#else
# define
_T(X) x
#endif


// Wenn UNICODE gesetzt ist, expandiert folgender Ausdruck:
_T("hello")
// zu
L"hello"
// Falls UNICODE nicht gesetzt ist, dann wird daraus:
"hello"
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
#if defined(UNICODE)
# define
_T(x) L ## x
#else
# define
_T(X) x
#endif


// Wenn UNICODE gesetzt ist, expandiert folgender Ausdruck:
_T("hello")
// zu
L"hello"
// Falls UNICODE nicht gesetzt ist, dann wird daraus:
"hello"


Wenn du sowieso kein Multibyte verwenden willst und nur Unicode, wozu ich eigentlich auch raten würde, dann verwende immer gleich L, wchar_t und std::wstring. Die Makros kannst du dir sparen.

Jochen Kalmbach schrieb:
Das frage ich mich auch schon immer...

Ich hoffe, dass dies nicht dein Ernst ist? Ansonsten:
http://www.gotw.ca/gotw/019.htm

Grüssli

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
Hi
Unregistrierter




Beitrag Hi Unregistrierter 01:54:20 03.09.2010   Titel:              Zitieren

Aber warum nicht auf Multibyte stellen?
Man verwendet normal ASCII Strings und wo man Unicode braucht, nimmt man es halt.
Jochen Kalmbach
Moderator

Benutzerprofil
Anmeldungsdatum: 11.11.2005
Beiträge: 11312
Beitrag Jochen Kalmbach Moderator 12:22:37 03.09.2010   Titel:              Zitieren

Hä? Wie soll denn das gehen? Das ist ja dann ein furchbares durcheinander was kaum durchgängig funktionieren wird...

_________________
Greetings
Jochen
(Microsoft MVP VC++) My blog about Win32 and .NET: http://blog.kalmbach-software.de/ (deutsch)
Hi
Unregistrierter




Beitrag Hi Unregistrierter 13:09:43 03.09.2010   Titel:              Zitieren

Wenn man auf Unicode stellt, kann man doch gar keine ASCII-Stringliterale mehr definieren?!
In einigen Anwendungen braucht man aber sowohl ASCII/ANSI (whatever lol) und Unicode. Dann stellt man halt auf Multibyte und wo man char* braucht, definiert man char* = "", und wo man wchar_t* braucht, definiert man halt wchar_t* = L""...
Nicht?
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 7252
Beitrag Dravere Moderator 13:24:55 03.09.2010   Titel:              Zitieren

Hi schrieb:
Wenn man auf Unicode stellt, kann man doch gar keine ASCII-Stringliterale mehr definieren?!

Wie kommst du auf den Unsinn? Grundsätzlich wird nur das Makro UNICODE gesetzt. Wodurch die WinAPI Funktionen zur W-Funktion expandieren. Also zum Beispiel aus MessageBox wird dann MessageBoxW. Es hindert dich aber niemand daran direkt MessageBoxA aufzurufen.

Hi schrieb:
In einigen Anwendungen braucht man aber sowohl ASCII/ANSI (whatever lol) und Unicode. Dann stellt man halt auf Multibyte und wo man char* braucht, definiert man char* = "", und wo man wchar_t* braucht, definiert man halt wchar_t* = L""...

Wenn du auf Unicode stellst, kannst du dies genau gleich verwenden. Daran ändert die Einstellung nichts.

Grüssli

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
rüdiger
Moderator

Benutzerprofil
Anmeldungsdatum: 11.07.2001
Beiträge: 22630
Beitrag rüdiger Moderator 14:24:45 03.09.2010   Titel:              Zitieren

xor schrieb:
Für das Speichern von Daten hat sich UTF8 für mich bewährt, eben weil man es unter Linux stillschweigend für System-Aufrufe nutzen kann. Unter Windows ist das allerdings eine ungute Herumkonvertiererei. Der einzige Verteil ist, das UTF-8 in ein reguläres char-Array passt und so wunderbar system-unabhängig in Dateien geschrieben werden kann. Wenn man unter Windows Unicode benutzt verwendet man immer UTF-16, da der wchar_t 16 bit breit ist, während wchar_t unter vielen Unices 32 bit breit ist und UTF-32 darstellt.


UTF-8 und UTF-16 sind ja sogar VariableByte :).

IMHO sind UTF-8 und UTF-32 die einzig sinnvollen Unicodevarianten. Der Rest ist nur für Spezialfälle und Legacysysteme. UTF-8 ist gut, wenn man den Text möglichst klein haben will oder eben für Legacysysteme :). UTF-32 ist gut, wenn man sehr viel zeichenweise machen will.
Jochen Kalmbach
Moderator

Benutzerprofil
Anmeldungsdatum: 11.11.2005
Beiträge: 11312
Beitrag Jochen Kalmbach Moderator 15:29:04 03.09.2010   Titel:              Zitieren

UTF-16 ist gut, wenn man WinAPI Funktionen direkt ansprechen will... das geht nun mal mit UTF-8 nicht da Windows dies nicht als Encoding seiner *A-Funkionen nicht unterstützt.
Fazit: Verwende möglichst immer die *W-Funktionen, wenn Du alle Zeichensätze darstellen willst... und damit verwende auch "wchar_t" bzw. "UTF-16".

UTF-32 wird in der Praxis nie eingesetzt...

_________________
Greetings
Jochen
(Microsoft MVP VC++) My blog about Win32 and .NET: http://blog.kalmbach-software.de/ (deutsch)
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 7252
Beitrag Dravere Moderator 17:32:54 03.09.2010   Titel:              Zitieren

rüdiger schrieb:
UTF-8 ist gut, wenn man den Text möglichst klein haben will oder eben für Legacysysteme :).

Nicht zum Beispiel im asiatischen Raum. Wenn ich mich recht erinnere brauchen gerade chinesische Zeichen in UTF-8 meistens 3 Bytes, während sie in UTF-16 nur 2 Bytes benötigten. Daher wird UTF-16 noch oft im asiatischen Raum eingesetzt.

rüdiger schrieb:
UTF-32 ist gut, wenn man sehr viel zeichenweise machen will.

Kannst du auch bei UTF-32 vergessen. Gewisse Zeichen setzen sich aus mehreren UTF-32 Werten zusammen. Man braucht genauso Indextabellen wie in UTF-8 und UTF-16.

Ein Vorteil von UTF-8 ist, dass man keine Unterscheidung zwischen LE und BE hat.

Grüssli

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
C/C++ Forum :: Compiler- und IDE-Forum ::  VisialStudio: MultiByte vs Unicode  
Gehen Sie zu Seite Zurück  1, 2, 3, 4  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.