Ich möchte std::string in eine Konstante wchar_t umwandeln *

Lesezeit: 3 Minuten

Ich mochte stdstring in eine Konstante wchar t umwandeln
Benutzer25749

Gibt es eine Methode? Mein Computer ist AMD64.

::std::string str;
BOOL loadU(const wchar_t* lpszPathName, int flag = 0);

Als ich verwendet habe:

loadU(&str);

Der VS2005-Compiler sagt:

Error 7 error C2664:: cannot convert parameter 1 from 'std::string *__w64 ' to 'const wchar_t *'

Wie kann ich es tun?

1643450407 959 Ich mochte stdstring in eine Konstante wchar t umwandeln
marijne

Konvertieren Sie es zuerst in std::wstring:

std::wstring widestr = std::wstring(str.begin(), str.end());

Dann holen Sie sich die C-Saite:

const wchar_t* widecstr = widestr.c_str();

Dies funktioniert nur für ASCII-Zeichenfolgen, aber es funktioniert nicht, wenn die zugrunde liegende Zeichenfolge UTF-8-codiert ist. Die Verwendung einer Konvertierungsroutine wie MultiByteToWideChar() stellt sicher, dass dieses Szenario ordnungsgemäß behandelt wird.

  • Dies sollte für ASCII-Zeichenfolgen gut funktionieren, aber es funktioniert nicht, wenn die zugrunde liegende Zeichenfolge UTF-8-codiert ist. Die Verwendung einer Konvertierungsroutine wie MultiByteToWideChar() stellt sicher, dass dieses Szenario ordnungsgemäß behandelt wird.

    – Matt Dillard

    29. Oktober 08 um 13:50 Uhr

  • Sie sollten MultiByteToWideChar mit korrekter Codepage verwenden. Um genau zu sein, sind zwei Aufrufe erforderlich: der erste, um die erforderliche Länge des Zielstrings wchar_t zu erhalten, und der zweite, um den char-String in den wchar_t-String umzuwandeln.

    – Johann Gerell

    30. Oktober 08 um 8:56 Uhr

  • Es funktioniert nur, wenn wchar_t Unicode und char Latin-1 oder ASSCII ist. Die ersten 256 Zeichenwerte von Unicode stimmen genau mit Latin-1 überein; die ersten 128 Zeichen von Latin-1 stimmen exakt mit ASCII überein.

    – MSalter

    30. Oktober 08 um 10:07 Uhr

  • kann ‘const char*’ nicht in ‘wchar_t*’ konvertieren

    – Hani Goc

    8. Dezember 15 um 13:46 Uhr

  • das gibt mir einen Fehler: cannot convert from 'const wchar_t *' to 'wchar_t *' Ich musste verwenden: const wchar_t* widecstr = widestr.c_str();

    – Wakan Tanka

    15. Februar 17 um 13:16 Uhr


Ich mochte stdstring in eine Konstante wchar t umwandeln
Matt Dillard

Wenn Sie ein std::wstring-Objekt haben, können Sie es aufrufen c_str() darauf, a zu bekommen wchar_t*:

std::wstring name( L"Steve Nash" );
const wchar_t* szName = name.c_str();

Da Sie jedoch mit einer schmalen Saite arbeiten, müssten Sie diese zuerst weiten. Hier gibt es verschiedene Möglichkeiten; Eine besteht darin, das integrierte Windows zu verwenden MultiByteToWideChar Routine. Das gibt dir ein LPWSTR, was gleichbedeutend ist mit wchar_t*.

  • @ʎǝʞuoɯɹǝqʎɔ: Du meinst wstring var = L"text";

    – Muhende Ente

    12. März 15 um 20:45 Uhr

Sie können die ATL-Textkonvertierungsmakros verwenden, um eine schmale Zeichenfolge (char) in eine breite Zeichenfolge (wchar_t) zu konvertieren. Um beispielsweise einen std::string zu konvertieren:

#include <atlconv.h>
...
std::string str = "Hello, world!";
CA2W pszWide(str.c_str());
loadU(pszWide);

Sie können auch eine Codepage angeben. Wenn Ihr std::string also UTF-8-Zeichen enthält, können Sie Folgendes verwenden:

CA2W pszWide(str.c_str(), CP_UTF8);

Sehr nützlich, aber nur Windows.

  • Sie möchten wahrscheinlich CA2CW. Vielleicht möchten Sie auch eine grundlegende Erklärung für die Namenskonvention von Makros hinzufügen (z. B.: Const Ascii -> Const Wchar).

    – Nik

    29. Oktober 08 um 15:48 Uhr

  • Es gibt keine CA2CW-Konvertierungsfunktion. Es gibt eine CA2CT-Version, aber diese nennt sich einfach CA2W. Siehe für eine vollständige Liste.

    – Rauben

    30. Oktober 08 um 8:58 Uhr

  • Unglaublich nützlich. Nur in meinem Fall #include <atlstr.h> gearbeitet, während #include <atlconv.h> nicht. Keine Ahnung warum.

    – ceztko

    16. Juli 11 um 7:17 Uhr

  • Ich würde auch empfehlen CA2WEX stattdessen, wodurch potenzielle Stapelüberläufe umgangen werden.

    – Muhende Ente

    12. März 15 um 20:47 Uhr

Wenn Sie Linux/Unix verwenden, werfen Sie einen Blick auf mbstowcs() und wcstombs(), die in GNU C (von ISO C 90) definiert sind.

  • mbs steht für “Multi Bytes String” und ist im Grunde der übliche nullterminierte C-String.

  • wcs steht für Wide Char String und ist ein Array von wchar_t.

Weitere Hintergrundinformationen zu Breitzeichen finden Sie in der glibc-Dokumentation Hier.

.

686470cookie-checkIch möchte std::string in eine Konstante wchar_t umwandeln *

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy