Come faccio a convertire System :: WideString a un char * e viceversa?
-
20-09-2019 - |
Domanda
Ho una situazione in cui ho bisogno per confrontare un char*
con un WideString
.
Come faccio a convertire il WideString ad un char * in C ++?
Soluzione
È possibile utilizzare la funzione wcstombs.
size_t wcstombs (char * mbstr, wchar_t const * wcstr, size_t max) ;
Altri suggerimenti
WideCharToMultiByte () e < a href = "http://msdn.microsoft.com/en-us/library/dd319072(VS.85).aspx" rel = "nofollow noreferrer"> MultiByteToWideChar () .
Non è possibile. In realtà, è mescolato due concetti diversi:
- WideString implica un buffer nella codifica UTF-16.
- char * può contenere qualsiasi cosa, da UTF-8 a testo ASCII-sola (nel qual caso, questo è convertibile solo se il WideString non contenga caratteri non ASCII).
Si prega di vedere la mia risposta a https://stackoverflow.com/questions/1049947/ dovrebbe UTF-16-essere-considerato nocivo su come gestire correttamente il testo.
confrontare System::WideString
oggetto con un char*
(come la questione corpo dice che si vuole fare), è possibile creare un nuovo oggetto WideString
dal puntatore e quindi utilizzare operatore ==
ordinario. La classe ha diversi costruttori, tra cui uno per const char*
.
char* foo = ...;
WideString bar = ...;
if (WideString(foo) == bar)
std::cout << "They're equal!\n";
In realtà, fino a quando l'oggetto WideString
si trova sulla sinistra, non è nemmeno necessario la chiamata al costruttore, perché il puntatore sarà convertito automaticamente.
if (bar == foo) { ... }
conversione un WideString
ad un char*
(come la questione titolo dice che si vuole fare), si potrebbe considerare l'utilizzo di tipo AnsiString
. Sono convertibili tra loro. Per ottenere il puntatore ordinario, chiamare il href="http://docwiki.embarcadero.com/VCL/en/System.AnsiStringT.c_str" rel="nofollow noreferrer"> c_str
metodo std::string.
WideString bar = ...;
AnsiString foo = bar;
std::cout << foo.c_str();