Standardcodierung für die Konvertierung von Varianten bstr in std :: string

8

Ich habe eine Variante bstr, die aus MSXML-DOM gezogen wurde, also in UTF-16. Ich versuche herauszufinden, welche Standardcodierung bei dieser Konvertierung auftritt:

%Vor%

Beim Testen glaube ich, dass die Standardcodierung entweder Windows-1252 oder Ascii ist, bin mir aber nicht sicher.

Übrigens, das ist der Teil des Codes, den ich repariere und die Variante in einen wstring umwandle und mit einem Aufruf von WideCharToMultiByte in eine Multi-Byte-Codierung übergehe.

Danke!

    
Kirill V. Lyadvinsky 01.12.2009, 16:58
quelle

2 Antworten

10

Die Methode operator char* ruft _com_util::ConvertBSTRToString() auf. Die Dokumentation ist ziemlich wenig hilfreich, aber ich nehme an, dass sie die aktuelle verwendet Ländereinstellung für die Konvertierung.

Aktualisierung:

Intern ruft _com_util::ConvertBSTRToString() WideCharToMultiByte auf und übergibt die Null für alle Codepage- und Standardzeichenparameter. Dies entspricht der Übergabe von CP_ACP , was bedeutet, dass die aktuelle ANSI-Codepageeinstellung des Systems verwendet wird (nicht die aktuelle Threadeinstellung).

Wenn Sie vermeiden möchten, Daten zu verlieren, sollten Sie WideCharToMultiByte direkt aufrufen und CP_UTF8 verwenden. Sie können die Zeichenfolge weiterhin als nullterminierte Einzelbytezeichenfolge behandeln und std::string verwenden. Sie können Bytes nicht als Zeichen behandeln.

    
Tim Sylvester 01.12.2009, 17:29
quelle
0

std::string selbst spezifiziert / enthält keine Codierung. Es ist nur eine Sequenz von Bytes. Dasselbe gilt für std::wstring , was lediglich eine Folge von wchar_t s (Doppelbyte-Wörter in Win32) ist.

Durch die Umwandlung von _bstr_t in ein char* über den Operator char * erhalten Sie einfach einen Zeiger auf die Rohdaten. Laut MSDN bestehen diese Daten aus großen Zeichen, dh wchar_t s, die repräsentieren UTF-16.

Ich bin überrascht, dass es tatsächlich funktioniert, ein std::string daraus zu konstruieren; Sie sollten nicht über das erste Nullbyte hinaus kommen (was bald der Fall ist, wenn Ihre ursprüngliche Zeichenfolge Englisch ist).

Aber da wstring eine Zeichenkette von wchar_t ist, sollten Sie in der Lage sein, direkt aus der _bstr_t wie folgt eine zu konstruieren:

%Vor%

(Ich bin mir nicht sicher über length ; ist es die Anzahl der Bytes oder die Anzahl der Zeichen?) Dann haben Sie ein wstring , das in UTF-16 kodiert ist und auf dem Sie% co_de aufrufen können %.

    
Thomas 01.12.2009 17:22
quelle

Tags und Links