windows - C + + UNICODE og STL

Indlæg af Hanne Mølgaard Plasc

Problem



Windows API virker stort på UNICODE, du laver et nyt projekt i Visual C ++, og det indstiller det til UNICODE som standard.

Og jeg forsøger at være en god Windows-programmør, jeg vil bruge UNICODE.


Problemet er C ++ Standard Library og STL (som std :: string eller std :: runtime\_error ) fungerer ikke godt med UNICODE strenge.
Jeg kan kun sende en std :: streng eller en char* til std :: runtime\_error , og jeg er helt sikker på std :: streng understøtter ikke UNICODE.


Så mit spørgsmål er, hvordan skal jeg bruge ting som std :: runtime\_error ? Skal jeg blande UNICODE og regelmæssig ANSI? (Jeg synes det er en dårlig ide ...)

Brug bare ANSI i hele mit projekt? (foretrækker ikke ..) Eller hvad?

Bedste reference


Generelt bør du ikke blande disse to kodninger. Undtagelsesmeddelelser er dog noget, der kun er af interesse for udvikleren (fx i logfiler) og bør aldrig vises til brugeren (men se på Jims kommentar til en vigtig advarsel).


Så du er på den sikre side, hvis du bruger UNICODE til hele din brugerflade og bruger stadig std::exception osv. Bag kulisserne til udviklermeddelelser. Der skulle ikke være behov for at konvertere mellem de to.


Desuden er det et godt trick at definere en typedef for UNICODE - uafhængige strenge i C ++:


typedef std::basic\_string<TCHAR> tstring;


... og definere analogt tcout, tcin osv. Betinget:


#ifdef UNICODE
    std::wostream& tcout = std::wcout;
    std::wostream& tcerr = std::wcerr;
    std::wostream& tclog = std::wclog;
    std::wistream& tcin = std::wcin;
#else
    std::ostream& tcout = std::cout;
    std::ostream& tcerr = std::cerr;
    std::ostream& tclog = std::clog;
    std::istream& tcin = std::cin;
#endif

Andre referencer 1


Josh,


Se venligst mit svar her: https://softwareengineering.stackexchange.com/questions/102205/should-utf-16-be-considered-harmful[19]


Der er stigende antal ingeniører, der tror std :: string er bare perfekt til unicode på Windows, og er den rigtige måde at skrive bærbare og unicode-korrekte programmer hurtigere.

Andre referencer 2


Kig på denne (ret gamle nu) artikel om CodeProject: Opgradering af en STL-baseret applikation til brug af Unicode. Det dækker de problemer, du 'sandsynligvis vil ramme, hvis du' bruger STL i vid udstrækning. Det bør ikke være så slemt, og det er generelt værd at bruge brede strenge. [20]

Andre referencer 3


Hvis du vil arbejde med Windows Unicode API, skal du bare bruge de brede strengversioner - wstring osv. Det vandt ikke med exception::what(), men for det kan du bruge UTF-8-kodning, hvis du virkelig har brug for Unicode.