Wandeln Sie char * in LPWSTR um

Lesezeit: 4 Minuten

Wandeln Sie char in LPWSTR um
Scheith

Ich versuche, ein Programm für Multibyte-Zeichen in Unicode zu konvertieren.

Ich bin das Programm durchgegangen und habe den String-Literalen ein vorangestellt L so sehen sie aus L"string".

Das hat funktioniert, aber ich habe jetzt eine Zeichenfolge im C-Stil, die nicht konform ist. Ich habe die ausprobiert L und stecke es ein TEXT() aber die L wird dem Variablennamen hinzugefügt – nicht der Zeichenfolge – wenn ich verwende TEXT().

Ich habe versucht, es zu machen TCHAR aber dann beschwert es sich, dass es a nicht umwandeln kann TCHAR zu einem char *.

Welche Optionen bleiben mir?

Ich weiß, dass C und C++ unterschiedlich sind. Es ist eine alte hauseigene C-Bibliothek, die seit einigen Jahren in C++-Projekten verwendet wird.

  • Der Hauptgrund, warum jemand ablehnen würde, wäre meiner Meinung nach eher das Fehlen von Quellcode in Ihrer Frage. Ein Bild sagt mehr als tausend Worte, ebenso wie ein Stück Code. Sogar ein banales.

    – bald

    28. Juli 11 um 11:58 Uhr


  • Sie können definitiv Code schreiben, der mit funktioniert TCHAR Unabhängig von der Compiler-Einstellung müssen Sie nur die richtige Infrastruktur erstellen. In C++ übernimmt das Überladen die ganze schwere Arbeit für Sie.

    – Kerrek SB

    28. Juli 11 um 12:17 Uhr

  • Mögliches Duplikat von How to convert char* to LPCWSTR?

    – Rostiger Nagel

    4. Mai 16 um 10:28 Uhr

1642365490 331 Wandeln Sie char in LPWSTR um
Raffael R.

Der std::mbstowcs Funktion ist was du suchst:

 char text[] = "something";
 wchar_t wtext[20];
 mbstowcs(wtext, text, strlen(text)+1);//Plus null
 LPWSTR ptr = wtext;

Pro stringS,

 string text = "something";
 wchar_t wtext[20];
 mbstowcs(wtext, text.c_str(), text.length());//includes null
 LPWSTR ptr = wtext;

–> ED: Das Präfix “L” funktioniert nur bei String-Literalen, nicht bei Variablen. <--

  • das ist veraltet, sollten Sie verwenden mbstowcs_s()

    – Olivpro

    28. Juli 11 um 12:05 Uhr

  • @Olipro: Dies ist nur in der Windows-Welt “veraltet”. Das OP gab nicht an, auf welche Plattform er abzielte.

    – bald

    28. Juli 11 um 12:18 Uhr

  • Es ist ziemlich implizit, dass die Plattform Windows ist, aber wenn Sie etwas anderes denken, machen Sie weiter und beweisen Sie mir das Gegenteil.

    – Olivpro

    28. Juli 11 um 12:25 Uhr

  • @olipro: was ist der vorteil der _s Versionen? Soweit ich das beurteilen kann, übergeben Sie einen weiteren Zählparameter, der angibt, wie viele Zeichen Sie ausschreiben möchten, aber wie hilft das? Sie geben die Größe des Ausgabepuffers bereits in einem anderen Argument an, nur wegen der abschließenden Null?

    – Kerrek SB

    28. Juli 11 um 12:26 Uhr

  • Verstehe ich das richtig, dass es nur umwandeln geht char* zu LPWSTR wenn die Länge der char* ist bekannt? Wenn nein, warum wurde die Annahme getroffen, dass 20 Zeichen ausreichen?

    – Masston

    31. August 2020 um 08:17 Uhr

1642365490 864 Wandeln Sie char in LPWSTR um
Kerrek SB

Die saubere Art zu verwenden mbstowcs ist, es zweimal aufzurufen, um die Länge des Ergebnisses zu ermitteln:

  const char * cs = <your input char*>
  size_t wn = mbsrtowcs(NULL, &cs, 0, NULL);

  // error if wn == size_t(-1)

  wchar_t * buf = new wchar_t[wn + 1]();  // value-initialize to 0 (see below)

  wn = mbsrtowcs(buf, &cs, wn + 1, NULL);

  // error if wn == size_t(-1)

  assert(cs == NULL); // successful conversion

  // result now in buf, return e.g. as std::wstring

  delete[] buf;

Vergessen Sie nicht anzurufen setlocale(LC_CTYPE, ""); zu Beginn Ihres Programms!

Der Vorteil gegenüber dem Windows MultiByteToWideChar ist, dass dies vollständig Standard-C ist, obwohl Sie unter Windows möglicherweise ohnehin die Windows-API-Funktion bevorzugen.

Normalerweise verpacke ich diese Methode zusammen mit der anderen Methode in zwei Konvertierungsfunktionen string->wstring und wstring->string. Wenn Sie auch triviale Überladungen hinzufügen string->string und wstring->wstring, können Sie einfach Code schreiben, der mit der Winapi kompiliert wird TCHAR typedef in jeder Einstellung.

[Edit:] Ich habe Null-Initialisierung hinzugefügt buf, falls Sie das C-Array direkt verwenden möchten. Normalerweise würde ich das Ergebnis als zurückgeben std::wstring(buf, wn), aber seien Sie vorsichtig, wenn Sie nullterminierte Arrays im C-Stil verwenden möchten.[/]

In einer Multithread-Umgebung sollten Sie einen Thread-lokalen Konvertierungsstatus als letzten (derzeit unsichtbaren) Parameter an die Funktion übergeben.

Hier ist ein kleiner Rant von mir zu diesem Thema.

  • +1, um zu zeigen, wie die Funktion zweimal aufgerufen wird, um die Länge des Ausgabepuffers zu erhalten

    – David Heffernan

    28. Juli 11 um 12:11 Uhr

  • Beifall. In der Privatsphäre meiner eigenen Gedanken verwende ich tatsächlich ein Array mit variabler Länge für buf, aber das wollte ich angesichts der SO-Prüfung vermeiden 🙂

    – Kerrek SB

    28. Juli 11 um 12:13 Uhr


  • Update: Heutzutage würde ich suchen codecvt, die wickelt mbsrtowcs/wcsrtombs.

    – Kerrek SB

    19. Juli 13 um 12:23 Uhr


Diese Version verwendet die Windows-API-Funktion MultiByteToWideChar(), übernimmt die Speicherzuweisung für beliebig lange Eingabezeichenfolgen.

int lenA = lstrlenA(input);
int lenW = ::MultiByteToWideChar(CP_ACP, 0, input, lenA, NULL, 0);
if (lenW>0)
{
    output = new wchar_t[lenW];
    ::MultiByteToWideChar(CP_ACP, 0, input, lenA, output, lenW);
} 

  • @Kerrek Der Kürze halber habe ich den aufrufenden Code weggelassen free 😉

    – David Heffernan

    28. Juli 11 um 12:16 Uhr

  • Ich würde es lieber lassen, wie es ist, als anzurufen free()! Dies ist definitiv ein Fall für die Prominenten delete[] Ausdruck 🙂

    – Kerrek SB

    28. Juli 11 um 12:18 Uhr

  • @kerrek In der Tat! Es ist so schwer, in C und C++ von Frage zu Frage den Überblick zu behalten.

    – David Heffernan

    28. Juli 11 um 12:30 Uhr

  • Es scheint, dass der Aufruf von ‘lstrlenA (input)’ nicht erforderlich ist. Sehen MSDN. cbMultiByte : Größe in Byte der Zeichenfolge, die durch den lpMultiByteStr-Parameter angegeben wird. Alternativ kann dieser Parameter auf -1 gesetzt werden, wenn die Zeichenfolge nullterminiert ist. Verwenden Sie einfach -1 anstelle von lenA.

    – Alan Kasbekow

    4. August 16 um 15:14 Uhr


  • @Alan es könnte so gemacht werden, aber auf der anderen Seite bedeutet dies, dass die Länge einmal und nicht zweimal berechnet wird. Persönliche Wahl, denke ich.

    – David Heffernan

    4. August 16 um 15:18 Uhr

Sie dürfen verwenden CString, CStringA, CStringW um automatische Konvertierungen durchzuführen und zwischen diesen Typen zu konvertieren. Darüber hinaus können Sie auch verwenden CStrBuf, CStrBufA, CStrBufW um änderbare Zeichenfolgen für das RAII-Muster zu erhalten

  • Denken Sie daran, für dieses Makro #include einzuschließen

    – Dino-Dini

    28. Februar 21 um 20:02 Uhr

.

510210cookie-checkWandeln Sie char * in LPWSTR um

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

Privacy policy