Cómo convertir std::string a LPCWSTR en C++ (Unicode)

6 minutos de lectura

Como convertir stdstring a LPCWSTR en C Unicode
Billups de Toran

Estoy buscando un método o un fragmento de código para convertir std::string a LPCWSTR

1646757368 718 Como convertir stdstring a LPCWSTR en C Unicode
benny hilfiger

La solución es en realidad mucho más fácil que cualquiera de las otras sugerencias:

std::wstring stemp = std::wstring(s.begin(), s.end());
LPCWSTR sw = stemp.c_str();

Lo mejor de todo es que es independiente de la plataforma.

  • Esto solo funciona si todos los caracteres son de un solo byte, es decir, ASCII o ISO-8859-1. Cualquier cosa de varios bytes fallará miserablemente, incluido UTF-8.

    – Mark Ransom

    03/09/2013 a las 16:20

  • Creo que puedes simplificar la primera línea a: std::wstring stemp( s.begin(), s.end() ); Eso eliminaría una posible copia y se vería más simple; tenga en cuenta que el compilador puede que elimine la copia de todos modos, pero esto sigue siendo un aspecto más simple.

    – Kit10

    09/03/2016 a las 20:38


  • Señor, ¿qué pasa con todos los votos a favor? Esta respuesta funciona, a veces, solo por coincidencia. Ignora por completo el carácter. codificaciones. No puede simplemente ampliar un carácter angosto y esperar que mágicamente se convierta en un carácter ancho que represente el mismo punto de código. Es el equivalente moral de un reinterpret_cast. Este código no funciona. No utilice..

    – Inspeccionable

    30 de junio de 2016 a las 9:49

  • @nik: En Windows, un char generalmente se codifica como ANSI. Con la codificación ANSI, los valores del 128 al 255 se interpretan utilizando la página de códigos actualmente activa. Empujar esos valores en un wchar_t (codificación UTF-16 en Windows) no producirá el resultado deseado. Si quieres ser preciso, esto funciona exactamente en el 50% de los casos. Teniendo en cuenta la codificación de caracteres DBCS, ese porcentaje se reduce aún más.

    – Inspeccionable

    20 oct 2018 a las 18:31

  • Parece que funciona bien si tienes inicialmente wstringpor ejemplo: std::wstring szTitle = L"Hello — こんにちは — 你好!— 🔥💧"; se muestra correctamente en la barra de título de una ventana, cuando paso szTitle.c_str() a una función WinAPI. Sin embargo, el problema es si inicialmente string.

    – KeyKi

    22 de enero a las 6:34


Si está en un entorno ATL/MFC, puede usar la macro de conversión ATL:

#include <atlbase.h>
#include <atlconv.h>

. . .

string myStr("My string");
CA2W unicodeStr(myStr);

A continuación, puede utilizar unicodeStr como LPCWSTR. La memoria para la cadena Unicode se crea en la pila y luego se libera, luego se ejecuta el destructor para UnicodeStr.

1646757369 671 Como convertir stdstring a LPCWSTR en C Unicode
Ashi

Prefiero usar convertidores estándar:

#include <codecvt>

std::string s = "Hi";
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::wstring wide = converter.from_bytes(s);
LPCWSTR result = wide.c_str();

Encuentre más detalles en esta respuesta: https://stackoverflow.com/a/18597384/592651


Actualización 21/12/2020: Mi respuesta fue comentada por @Andreas H. Pensé que su comentario es valioso, así que actualicé mi respuesta en consecuencia:

  1. codecvt_utf8_utf16 está en desuso en C++17.
  2. Además, el código implica que la codificación de origen es UTF-8, lo que generalmente no es así.
  3. En C++20 hay un tipo separado std::u8string para UTF-8 debido a eso.

Pero funcionó para mí porque todavía estoy usando una versión anterior de C++ y sucedió que mi codificación fuente era UTF-8.

  • Desafortunadamente codecvt_utf8_utf16 está en desuso en C++17. También implica que la codificación de su fuente es UTF-8, que generalmente no lo es. En C++20 existe el tipo separado std::u8string para UTF-8 debido a eso.

    – Andreas H.

    26 oct 2020 a las 8:35


Si está utilizando QT, puede convertir a QString y luego myqstring.toStdWString() hará el truco.

Como convertir stdstring a LPCWSTR en C Unicode
Top Master

  • Después de saber eso, el estándar C++11 tiene reglas para .c_str() método (tal vez .data() también), lo que nos permite utilizar const_cast,

(Quiero decir, normalmente usando const_cast puede ser peligroso)

  • podemos tomar con seguridad “const“parámetro de entrada.
  • Luego, finalmente, use “const_cast” en lugar de cualquier asignación y eliminación innecesarias.
std::wstring s2ws(const std::string &s, bool isUtf8 = true)
{
    int len;
    int slength = (int)s.length() + 1;
    len = MultiByteToWideChar(isUtf8 ? CP_UTF8 : CP_ACP, 0, s.c_str(), slength, 0, 0);
    std::wstring buf;
    buf.resize(len);
    MultiByteToWideChar(isUtf8 ? CP_UTF8 : CP_ACP, 0, s.c_str(), slength,
           const_cast<wchar_t *>(buf.c_str()), len);
    return buf;
}

std::wstring wrapper = s2ws(u8"My UTF8 string!");
LPCWSTR result = wrapper.c_str();

Nota que debemos usar CP_UTF8 para el literal de cadena de C ++, pero en algunos casos es posible que deba usar en su lugar CP_ACP (estableciendo el segundo parámetro en false).

  • agradable, pero parece que habrá problemas al procesar algunos caracteres, como Microsoft® LifeCam Studio(TM).

    – Jay

    4 de noviembre de 2021 a las 13:17

  • @Jay Probablemente esté relacionado con la codificación; Probé tu muestra “®” con Qt’s QString::fromWCharArray(...) método y el resultado fue “®” pero QString::fromAscii(...) funciona bien, por lo que es ASCII

    – Top Master

    4 de noviembre de 2021 a las 14:17


  • Si quieres convertir "My UTF8 string!"deberías estar usando CP_UTF8. Como se implementa actualmente, esto utiliza la página de códigos ANSI predeterminada de Windows del sistema. Además, la cadena de C++ tiene un data() miembro para que no tengas que const_cast.

    – Inspeccionable

    10 de enero a las 19:47


  • @IInspectable Ambos .c_str() y .data() están const (tiempo MultiByteToWideChar no toma const entrada, al menos en mi SDK, por lo que simplemente necesito emitir o asignar un nuevo búfer). Pero gracias por mencionar CP_UTF8mira mi edición 😉

    – Top Master

    11 de enero a las 8:10


  • C++17 introdujo un data() sobrecarga que no es const.

    – Inspeccionable

    11 de enero a las 8:29

Como convertir stdstring a LPCWSTR en C Unicode
Sabbir Pulak

Es muy fácil, no es necesario aplicar ningún método personalizado. Prueba con esto:

string s = "So Easy Bro"
LPCWSTR wide_string;

wide_string = CA2T(s.c_str());

Creo que funcionará.

  • agradable, pero parece que habrá problemas al procesar algunos caracteres, como Microsoft® LifeCam Studio(TM).

    – Jay

    4 de noviembre de 2021 a las 13:17

  • @Jay Probablemente esté relacionado con la codificación; Probé tu muestra “®” con Qt’s QString::fromWCharArray(...) método y el resultado fue “®” pero QString::fromAscii(...) funciona bien, por lo que es ASCII

    – Top Master

    4 de noviembre de 2021 a las 14:17


  • Si quieres convertir "My UTF8 string!"deberías estar usando CP_UTF8. Como se implementa actualmente, esto utiliza la página de códigos ANSI predeterminada de Windows del sistema. Además, la cadena de C++ tiene un data() miembro para que no tengas que const_cast.

    – Inspeccionable

    10 de enero a las 19:47


  • @IInspectable Ambos .c_str() y .data() están const (tiempo MultiByteToWideChar no toma const entrada, al menos en mi SDK, por lo que simplemente necesito emitir o asignar un nuevo búfer). Pero gracias por mencionar CP_UTF8mira mi edición 😉

    – Top Master

    11 de enero a las 8:10


  • C++17 introdujo un data() sobrecarga que no es const.

    – Inspeccionable

    11 de enero a las 8:29

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad