CString format und Unicode (std::string) Verständins
-
Hallo Leute,
ich habe echt Schwierigkeiten hinsichtlich Unicode, und der Format funktion von CString
Folgender code:
item.Format(_T("ITEM %i %i %f"), (int)it.alarmId(), (int)it.distance(), (double)it.angle());
macht das :
"ITEM 59 1830 158.268799"
das passt ja:)
Das selbst mit nem String dabei (siehe 2tes Argument)
item.Format(_T("ITEM %i %s %i %f"), (int)it.alarmId(), CA2T(field->second.name.c_str()), (int)it.distance(), (double)it.angle());
kommt das raus ??
"ITEM 59 Feld (1) 6619206 0.000000"
der Input beider calles is der gleiche (außer eben plus dem zusätzlichen %s string)
irgendwas verhaut (memory) es mir hier.
Liegst vll. daran:
CA2T(field->second.name.c_str())
in dem format Kontext nicht richtig?
der String wird schonmal richtig von Ascc(utf8) nach unicode konvertiert
Danke Euch für drüberschaun
EDIT :
CString item;
-
@SoIntMan sagte in CString format und Unicode (std::string) Verständins:
der String wird schonmal richtig von Ascc(utf8) nach unicode konvertiert
Diese Zeile verstehe ich nicht.
CA2T konvertiert "ANSI" (Windows-1252) nach "T", wenn ich die Doku richtig verstehe. Was verstehst du unter "Ascc(utf8) nach unicode"? UTF-8 ist eine mögliche Kodierung von Unicode-Zeichen.
Was steht denn in
field->second.name.c_str()
und was ist "T" bei dir (W oder A)?
-
@wob sagte in CString format und Unicode (std::string) Verständins:
field->second.name.c_str()
std::string x= field->second.name; //UTF-8 codierter text CString name(CA2T(x.c_str())); //Hier dachte ich dass utf-8 nach unicode convertiert wird item.Format(_T("ITEM %i %s %i %f"), (int)it.alarmId(), name, (int)it.distance(), (double)it.angle());
aber hmm so geht es , wenn ich explicit ne CString drauß machen dazwischen aber inline wie oben wohl nich.
-
Ist der
std::string
wirklich UTF8 kodiert (und nicht einfach nur ANSI)? Dann funktioniert die Umwandlung, wie @wob schon geschrieben hat, so nicht (siehst du natürlich erst, wenn dort Umlaufe oder andere Sonderzeichen (>= 0x80
) drin sind).
-
UFT-8 ist UNICODE. UTF-8 ist eine Kodierung wie Unicode Zeichen binär abgebildet werden.
Windows verwendet intern UTF-16 für Unicode.
CA2T convertiert ANSI nach UTF-16.
-
@firefly sagte in CString format und Unicode (std::string) Verständins:
CA2T convertiert ANSI nach UTF-16.
Aber Vorsicht vor CAT-2-Kabeln!
-
@firefly sagte in CString format und Unicode (std::string) Verständins:
CA2T convertiert ANSI nach UTF-16.
Das stimmt nicht ganz.
Das Makro endet nämlich auf T, ein starkes Indiz für die Projekteinstellung Zeichensatz. Steht der Zeichensatz auf Unicode, so wandelt CA2T ANSI nach UTF-16. Steht der Zeichensatz auf Multibyte, so wandelt die Funktion ANSI nach ANSI.
Das Ganze sieht man schön, wenn man sich die Definition von CA2T aus der Datei atlconv.h anschaut:
#ifdef _UNICODE // ... #define CA2T CA2W // ... #else // !_UNICODE // ... #define CA2T CA2A // ... #endif // !_UNICODE
-
@Th69 sagte in CString format und Unicode (std::string) Verständins:
Ist der std::string wirklich UTF8 kodiert (und nicht einfach nur ANSI)? Dann funktioniert die Umwandlung, wie @wob schon geschrieben hat, so nicht (siehst du natürlich erst, wenn dort Umlaufe oder andere Sonderzeichen (>= 0x80) drin sind).
richtng ihr habt recht, es ist ANSI. d.h. dann ist as generell richtig mit CAT2
aber wie gesagt, wenn ich
CString name(CA2T(field->second.name.c_str()));
und dann erst
item.Format( _T("[%i] '%s' d:%i a:%.2f"), (int)it.alarmId(), name, (int)it.distance(), (double)it.angle());
funktionier es, oder is das einfach nur zufall?:)
-
-
@Quiche-Lorraine sagte in CString format und Unicode (std::string) Verständins:
Nutzt du hier einen std::string_view?
Unwahrscheinlich, da @SoIntMan doch
second.name.c_str()
nutzt - und die Funktionc_str()
gibt es beistd::string_view
nicht. Wird daher wohl einstd::string
sein.
-
Warum überhaupt
std::string
in einemUNICODE
-Projekt?
Besser gleich folgendes benutzen:typedef std::basic_string<TCHAR> tstring; // or string_t
also
string
oderwstring
- je nachdem, obUNICODE
definiert ist.s.a. How do you convert CString and std::string, std::wstring to each other?
-
@Th69 sagte in CString format und Unicode (std::string) Verständins:
Warum überhaupt
std::string
in einemUNICODE
-Projekt?
Besser gleich folgendes benutzen:typedef std::basic_string<TCHAR> tstring; // or string_t
also
string
oderwstring
- je nachdem, obUNICODE
definiert ist.Ich weiß nicht. Ich würde versuchen, wo es geht die wstrings/TCHAR zu vermeiden und immer mit UTF-8 in std::string arbeiten und nur dort, wo es nötig ist, umwandeln. Dieses "je nachdem, ob UNICODE gesetzt ist", mag ich nicht. Ist aber sicher eine Philosophiefrage. Ich würde mich also nach https://utf8everywhere.org/#windows richten.
-
@Th69 sagte in CString format und Unicode (std::string) Verständins:
Warum überhaupt
std::string
in einemUNICODE
-Projekt?Vermutlich wird der wert für "field->second.name" in UTF-8 kodiert geliefert.
-
Guten morgen Leute,
Ich benutze std::string weil ich es nicht besser weißt .. sagen wir es mal so. Eigentlich bekomme ich eine char* als zeichen kette im ANSI Format von einem Gerät. Und ich habe eine MFC Project UNICODE.
Da ich keinerlei Erfahrung habe, und den c++ 11 Standard verwende wollte , habe ich immer den Wet char* => std::string => CString verwendet.. und da kam jetzt eben die UNICOD Problematik ins Spiel.)
Und wie ich sehe ist meine Wissen begrenzt diesbezüglich. Und lerne hier jetzt gerade viel dazu:)
-
Die Frage ist, ist es wirklich ANSI was vom Gerät geliefert wird?
z.b. können deutsche Umlaute oder andere Buchstaben/Zeichen im string vorkommen, welche nicht im ASCII Zeichensatz definiert sind?Wenn es wirklich ANSI ist, dann muss man wissen welche codepage genutzt wird, damit eine Konvertierung nach Unicode zu keiner Verfälschung des Textes führt.
https://en.wikipedia.org/wiki/Windows_code_page
Das MACRO CA2T wird bei der Konvertierung die Codepage nutzen, welche im System für ANSI konfiguriert wurde.
AFAIK lässt sich die verwendete Codepage auch via API call für einen Prozess ändern.
-
@firefly sagte in CString format und Unicode (std::string) Verständins:
Die Frage ist, ist es wirklich ANSI was vom Gerät geliefert wird?
z.b. können deutsche Umlaute oder andere Buchstaben/Zeichen im string vorkommen, welche nicht im ASCII Zeichensatz definiert sind?
https://www.asciitable.com/
Wenn es wirklich ANSI ist, dann muss man wissen welche codepage genutzt wird, damit eine Konvertierung nach Unicode zu keiner Verfälschung des Textes führt.
https://en.wikipedia.org/wiki/Windows_code_page
Das MACRO CA2T wird bei der Konvertierung die Codepage nutzen, welche im System für ANSI konfiguriert wurde.
AFAIK lässt sich die verwendete Codepage auch via API call für einen Prozess ändern.Hi als aus der Spec. heraus wird "ISO 8859-15" Encoding Was bedeutet das nun für mich , ist das CA2T Macro vernünftig?
-
@SoIntMan sagte in CString format und Unicode (std::string) Verständins:
ISO 8859-15
Das Makro CA2T (Was im UNICODE falle CA2W ist) hat einen zweiten Parameter mit dem man einen Identifier für die Codepage angeben kann.
CA2W ist wiederum nur ein "typedef" für CA2WEX für https://docs.microsoft.com/en-us/cpp/atl/reference/ca2wex-class?view=msvc-160
In deinem Falle wäre dass dann 28605 (iso-8859-15 ISO 8859-15 Latin 9: https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiers)
-
@firefly sagte in CString format und Unicode (std::string) Verständins:
Das Makro CA2T (Was im UNICODE falle CA2W ist) hat einen zweiten Parameter mit dem man einen Identifier für die Codepage angeben kann.
CA2W ist wiederum nur ein "typedef" für CA2WEX für https://docs.microsoft.com/en-us/cpp/atl/reference/ca2wex-class?view=msvc-160
In deinem Falle wäre dass dann 28605 (iso-8859-15 ISO 8859-15 Latin 9: https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiers)Optimal, danke, dann wäre das vermutlich alles gekärt;()
-
@SoIntMan Das CA2T Makro ist nur vernünftig wenn du a) mit TCHAR arbeitest und b) deine "narrow" Strings die System-Codepage verwenden. Wenn du dagegen immer mit ISO 8859-15 arbeitest, dann solltest du
MultiByteToWideChar
verwenden und dort die passende CodePage für ISO 8859-15 angeben.
-
@hustbaer sagte in CString format und Unicode (std::string) Verständins:
@SoIntMan Das CA2T Makro ist nur vernünftig wenn du a) mit TCHAR arbeitest und b) deine "narrow" Strings die System-Codepage verwenden. Wenn du dagegen immer mit ISO 8859-15 arbeitest, dann solltest du MultiByteToWideChar verwenden und dort die passende CodePage für ISO 8859-15 angeben.
sorry für die spät rückmeldung.. ok das nehm ich mir zu Herzen danke.. ich mach mich jetzt mal dran.. ich melde mich bestimmt nochmal:=)