Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

03.02.2008, 19:07

? Was ist mit std::wcout?

Naja egal auf jedenfall brauchst du noch MultiByte fürs Filesystem ... die meisten Betriebssysteme haben ihr Filesystem nicht auf UNICODE umgestellt und bei anderen (Microsoft) ist es nicht korrekt implementiert. Eines der Gründe warum im aktuellen C++ Standard auch noch bei std::wifstream ein const char* und kein const wchar_t* als Parameter für den Dateinamen genutzt wird!
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

12

04.02.2008, 16:49

Re: Unicode

Übrigens ist das nicht die Wahrheit:

Zitat von »"GR-PA"«

Diese Fehlermeldung liegt daran, dass Unicode-Zeichen (auch als breite Zeichen bezeichnet) doppelt soviel Speicher belegen, wie Multi-Byte Zeichen.


Alle char-Typen (unsigned char, signed char und char) sind in C++ fest auf den Wert 1 Byte definiert. Nachdem was du geschrieben hast müsste wchar_t auf 2 Byte festgelegt sein, was aber durchaus nicht den Tatsachen entspricht!

Im Übrigen wäre das auch etwas suboptimal, da der Unicodestandard weit mehr als 65.536 (2^16) Codepoints umfasst, nämlich aktuell 1.114.111, was impliziert das 16 Bit (angenommen 1 Byte hat 8 Bit) zu wenig Raum bieten würden.
@D13_Dreinig

GR-PA

Treue Seele

  • »GR-PA« ist der Autor dieses Themas

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

13

04.02.2008, 17:19

Stimmt. Das hab ich wohl mit irgendetwas verwechselt ;) . Hab' s abgeändert und hoffe, dass sonst alles stimmt.
Signaturen werden überbewertet

14

04.02.2008, 17:24

Naja kommt darauf an ... mein es war MSVC++ der nicht vollständig UNICODE drin hat ... in MSVC++ wird wchar_t meine ich als unsigned short definiert ... bin mir aber nicht ganz sicher ...(4Byte auf jedenfall ..)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

15

04.02.2008, 17:27

Zitat von »"Deviloper"«

Naja kommt darauf an ... mein es war MSVC++ der nicht vollständig UNICODE drin hat ... in MSVC++ wird wchar_t meine ich als unsigned short definiert ... bin mir aber nicht ganz sicher ...(4Byte auf jedenfall ..)


Das hat nichts damit zu tun ob der Compiler den Unicodestandard komplett umsetzt (das macht ohnehin kein C++ Compiler). Auch ist es vollkommen korrekt das bei einigen Platformen wchar_t als ein unsigned short definiert ist.
Die Sache ist nur, das es nicht so sein muss! :) Für die Zeichen in der BMP reichen die 16 Bit ja.
@D13_Dreinig

Beneroth

Alter Hase

Beiträge: 969

Wohnort: Schweiz

Beruf: Software Entwickler

  • Private Nachricht senden

16

05.02.2008, 08:46

öhm, alles ganz schön ABER...

hat C++ selber neben dem Dateityp auch ne Funktion zum transcodieren? Oder muss ich die selber schreiben?

:?: ;)

GR-PA

Treue Seele

  • »GR-PA« ist der Autor dieses Themas

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

17

05.02.2008, 09:08

Zitat von »"Beneroth"«

öhm, alles ganz schön ABER...

hat C++ selber neben dem Dateityp auch ne Funktion zum transcodieren? Oder muss ich die selber schreiben?

:?: ;)

Wer lesen kann ist klar im Vorteil ;)

Zitat von »"GR-PA"«

Hier kommmt nun ein Makro ins Spiel, das in WinDef.h definiert ist. Da WinDef.h von windows.h eingebunden wird, muss man also keine weiteren Headerdateien einbinden. Das Makro setzt je nachdem, ob Unicode Definiert ist ein L vor den String oder nicht. Das Makro wird wie folgt verwendet:

C-/C++-Quelltext

1
TEXT("Text")


Also muss man einfach immer, wenn eine Funktion eine Unicode und eine Multi-Byte Variante hat den Text über das Makro TEXT übergeben und schon ist man alle Probleme mit Unicode los und kann die Vorteile die der erweiterte Zeichensatz bietet in vollen Zügen ausnutzen.
Signaturen werden überbewertet

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

18

05.02.2008, 10:03

Zitat von »"Beneroth"«

öhm, alles ganz schön ABER...

hat C++ selber neben dem Dateityp auch ne Funktion zum transcodieren? Oder muss ich die selber schreiben?

:?: ;)


Es ist ein Datentyp. Was meinst du mit transcodieren? Das Umwandeln von wchar_t in char, und umgekehrt? Dann gibt es einige Funktionen.

Zum Beispiel (CRT => Microsoftspezifisch aber sicherer Equivalent zu wcsrtombs: wcsrtombs_s):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
mbstate_t mbstate;
const wchar_t* str1 = L"Hallo Welt";
char buffer[255] = {0};

memset((void*)&mbstate, 0, sizeof(mbstate));
wcsrtombs(buffer, &str1, 255, &mbstate);

if ( errno > 0 )
    printf( "widechar to multibyte encoding failed" );
else
    printf( "encoding succeeded: %s\n", buffer );


Oder (WinAPI):

C-/C++-Quelltext

1
2
3
4
5
6
7
const wchar_t* str1 = L"Hallo Welt";
char buffer[255] = {0};

if ( !WideCharToMultiByte(CP_UTF8, 0, str1, -1, buffer, 255, 0, 0) )
    printf( "widechar to multibyte encoding failed" );
else
    printf( "encoding succeeded: %s\n", buffer );


Oder (C++ Standard Library):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
const wchar_t* str1 = L"Hallo Welt";
char buffer[255] = {0};

#if defined(_MSC_VER) && _MSC_VER < 1000
    using std::use_facet;
    if ( _USE( std::cout.getloc(), std::ctype<wchar_t> ).narrow(str1, str1 + wcslen(str1), '?', buffer) == 0 )
#else
    if ( std::use_facet< std::ctype<wchar_t> >(std::cout.getloc()).narrow(str1, str1 + wcslen(str1), '?', buffer) == 0 )
#endif
        printf( "widechar to multibyte encoding failed" );
    else
        printf( "encoding succeeded: %s\n", buffer );
@D13_Dreinig

Beneroth

Alter Hase

Beiträge: 969

Wohnort: Schweiz

Beruf: Software Entwickler

  • Private Nachricht senden

19

05.02.2008, 21:56

Ja das meinte ich :D
Danke fürs erklären.

Da ich möglichst platformunabhängigen Code produzieren möchte wäre das da also mein Fall:

Zitat von »"David_pb"«


C-/C++-Quelltext

1
2
3
4
5
6
7
const wchar_t* str1 = L"Hallo Welt";
char buffer[255] = {0};

    if ( std::use_facet< std::ctype<wchar_t> >(std::cout.getloc()).narrow(str1, str1 + wcslen(str1), '?', buffer) == 0 )
        printf( "widechar to multibyte encoding failed" );
    else
        printf( "encoding succeeded: %s\n", buffer );


Leider hab ich (nicht auf cppReference.com, auch nicht mit Google) eine erklärung der funktionen darin gefunden, wär dir sehr verbunden wenn du mich auf ne entsprechende seite hinweist oder mir den teil schön zerpflückt erklärst. :) :roll:

20

05.02.2008, 22:08

Naja, eine sehr mäßige Einführung. Hauptsache alles ist windowsspezifisch und die STL wir außen vor gelassen.
Was hier noch fehlt ist z.B. wie man mit einfachen #defines und typedefs ein Programm einfach umschaltbar machen kann. Wie die Datentypen für std::strings heißen und wie man jetzt mit Unicode Textdateien umzugehen hat.
Also insgesamt recht oberflächlich.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige