(Encontré esta pregunta navegando al azar; ha pasado mucho tiempo desde que hice C ++.) ¿Entonces la biblioteca estándar no tiene conversión std :: string -> std :: wstring? Eso parece extraño; hay una buena razon
Domenic
5
Si usa std :: vector <wchar_t> para crear almacenamiento para buf, entonces, si algo arroja una excepción, su búfer temporal se liberará.
Jason Harrison
81
Razón # 233 de por qué C ++ me molesta muchísimo ... 10 líneas de código para una conversión de cadena simple = /
b1nary.atr0phy
2
¿O simplemente diga wstring ws (al comienzo (), al final ()) ...?
CJBrew
3
@CJBrew: Para cada problema hay una solución, que es limpia, elegante e incorrecta. El suyo se basa en la suposición de que su entrada solo contiene caracteres ASCII ( no ANSI).
Inspectable
121
La solución es mucho más fácil que cualquiera de las otras sugerencias:
Lo siento Benny, pero eso no funciona para mí, la propia solución de Toran parece funcionar bien (pero ... ¡bum!).
Iain Collins
32
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
Creo que puede simplificar la primera línea a: std :: wstring stemp (s.begin (), s.end ()); Eso eliminaría una posible copia y parecería más simple; tenga en cuenta que el compilador podría eliminar la copia de todos modos, pero este es un aspecto más simple.
Kit10
13
Señor, ¿qué pasa con todos los votos a favor? Esta respuesta funciona, a veces , solo por coincidencia. Ignora por completo las codificaciones de caracteres . No se puede simplemente ampliar un carácter estrecho y esperar que se convierta mágicamente en un carácter ancho que represente el mismo punto de código. Es el equivalente moral de a reinterpret_cast. Este código no funciona. No utilice. .
Inspectable
2
@nik: En Windows, a chargeneralmente se codifica como ANSI. Con la codificación ANSI, los valores de 128 a 255 se interpretan utilizando la página de códigos actualmente activa. Introducir esos valores en un wchar_t(codificación UTF-16 en Windows) no producirá el resultado deseado. Si quiere ser preciso, esto funciona exactamente en el 50% de los casos. Teniendo en cuenta la codificación de caracteres DBCS, ese porcentaje disminuye aún más.
IInspectable
9
Si se encuentra en un entorno ATL / MFC, puede utilizar la macro de conversión ATL:
A continuación, puede utilizar unicodeStr como LPCWSTR. La memoria para la cadena Unicode se crea en la pila y se libera, luego se ejecuta el destructor para unicodeStr.
Respuestas:
Gracias por el enlace al artículo de MSDN. Esto es exactamente lo que estaba buscando.
fuente
La solución es mucho más fácil que cualquiera de las otras sugerencias:
Lo mejor de todo es que es independiente de la plataforma. h2h :)
fuente
reinterpret_cast
. Este código no funciona. No utilice. .char
generalmente se codifica como ANSI. Con la codificación ANSI, los valores de 128 a 255 se interpretan utilizando la página de códigos actualmente activa. Introducir esos valores en unwchar_t
(codificación UTF-16 en Windows) no producirá el resultado deseado. Si quiere ser preciso, esto funciona exactamente en el 50% de los casos. Teniendo en cuenta la codificación de caracteres DBCS, ese porcentaje disminuye aún más.Si se encuentra en un entorno ATL / MFC, puede utilizar la macro de conversión ATL:
A continuación, puede utilizar unicodeStr como LPCWSTR. La memoria para la cadena Unicode se crea en la pila y se libera, luego se ejecuta el destructor para unicodeStr.
fuente
En lugar de usar std :: string, podría usar std :: wstring.
EDITAR: Lo siento, esto no es más explicativo, pero tengo que correr.
Utilice std :: wstring :: c_str ()
fuente
fuente
LPCWSTR lpcwName = std :: wstring (strname.begin (), strname.end ()). C_str ()
fuente