2009-06-18 19 views
29

Estoy tratando de convertir un C++ std::string a UTF-8 o std::wstring sin perder información (considere una cadena que contenga caracteres que no sean ASCII).¿Qué codificación usa std :: string.c_str()?

Según http://forums.sun.com/thread.jspa?threadID=486770&forumID=31:

Si el std :: string tiene caracteres no ASCII, debe proporcionar una función que convierte desde su codificación a UTF-8 [...]

¿Qué codificación usa std::string.c_str()? ¿Cómo puedo convertirlo a UTF-8 o std::wstring de forma multiplataforma?

Respuesta

35

std::string per se utiliza sin codificación - devolverá los bytes que pone en él. Por ejemplo, esos bytes pueden estar usando la codificación ISO-8859-1 ... o cualquier otra, realmente: la información sobre la codificación simplemente no está allí - ¡hay que saber de dónde vienen los bytes!

+0

¿Entonces esencialmente no hay forma de que convierta std :: string sin conocer su codificación antes de tiempo? Lo pregunto porque estoy escribiendo una función API que toma una std :: string. Supongo que la documentación deberá indicar a los usuarios qué formato debe pasar. – Gili

+3

@Gili, a la derecha: no se puede convertir de manera confiable una secuencia de bytes en una codificación desconocida a UTF-8 (o cualquier otra cosa ;-). Le recomiendo que le pida a la persona que llama que suministre datos UTF-8; la mayoría de las otras codificaciones no permiten la codificación de todas las posibles cadenas Unicode. Como dice @Naaff, ASCII es un caso especial de UTF-8 (e ISO-8859- * y muchas otras codificaciones), así que si ese es tu caso no hay que preocuparse (una nota al pie en los documentos les recuerda a los usuarios que podrían salvarlos). preocupación;-). –

+0

Buena respuesta, gracias :) – Gili

7

std::string contiene cualquier secuencia de bytes, por lo que la codificación depende de usted. Debes saber cómo está codificado. Sin embargo, si no sabes que es otra cosa, probablemente solo sea ASCII. En ese caso, ya es compatible con UTF-8.

+12

He visto "probablemente sea solo ... "ser la fuente de tantos errores de codificación de caracteres. Sugiero nunca adivinar cuando se trata de codificaciones de caracteres: Sea siempre muy explícito en lo que toma y lo que produce. En cada caso, si no especifica el juego de caracteres, especifique un parámetro adicional/valor de retorno para indicar la codificación. – MtnViewMark

Cuestiones relacionadas