2011-12-14 12 views
10

Para averiguar si C++ es el lenguaje correcto para un proyecto mío, quiero probar las capacidades de UTF-8. Según las referencias, he construido este ejemplo:Manejo de UTF-8 en C++

#include <string> 
#include <iostream> 

using namespace std; 

int main() { 
    wstring str; 
    while(getline(wcin, str)) { 
     wcout << str << endl; 
     if(str.empty()) break; 
    } 

    return 0; 
} 

Pero cuando escribo en un carácter UTF-8, que porta mal:

$ > ./utf8 
Hello 
Hello 
für 
f 
$ > 

No sólo no se imprime el ü, sino que también se cierra inmediatamente. gdb me dijo que no hubo un accidente, sino una salida normal, pero me resulta difícil de creer.

+0

¿A qué plataforma estás apuntando (Windows, Linux, etc.)? –

+0

Linux, en realidad. Si funciona en Windows, también es una especie de bonificación. – Lanbo

+2

¿Su configuración regional está configurada en una codificación UTF-8? –

Respuesta

8

No use wstring en Linux.

std::wstring VS std::string

Tome un vistazo a la primera respuesta. Estoy seguro de que responde tu pregunta.

  1. Cuando debo utilizar std :: wstring sobre std :: string?

En Linux? Casi nunca (§).

¿En Windows? Casi siempre (§).

+0

+1: Echa un vistazo a esta respuesta. Estoy seguro de que se vincula a una respuesta a su pregunta. – Klaim

+0

En los comentarios 'boost :: spirit' en UTF-8 siempre están hablando de usar' wchar_t'. – Lanbo

+0

@ Scán: Supongo que usan 'wchar_t' todo el tiempo para los puntos de código, utilizados al traducir UTF8 hacia y desde cualquier cosa. 'wchar_t' no es un buen personaje para UTF8. –

7

El idioma en sí no tiene nada que ver con unicode o cualquier otra codificación de caracteres. Está ligado al sistema operativo. Windows usa UTF16 para soporte unicode que implica el uso de caracteres anchos (caracteres de 16 bits anchos) - wchar_t o std: wstring. Cada función Win Api que opera con cadenas requiere una amplia entrada de caracteres.

Pero los sistemas basados ​​en Unix, es decir, Mac OS X o Linux usan UTF8. Por supuesto, solo se trata de cómo maneja los bytes en la matriz, por lo que puede tener una cadena UTF16 almacenada en una matriz C común o en un contenedor std: string. Esta es la razón por la cual no se ve ningún wstrings en código multiplataforma; en su lugar, todas las cadenas se manejan como UTF8 y se vuelven a codificar cuando sea necesario para UTF16 (en Windows).

Tiene más opciones sobre cómo manejar esto un poco confuso. Personalmente lo hago como se mencionó anteriormente, mediante el uso estricto de codificación UTF8 en todas las aplicaciones, recodificación de cadenas al interactuar con Windows Api y usarlas directamente en Mac OS X. Para la reconfiguración de win utilizo great conversion helpers:

C++ UTF-8 Conversion Helpers (en MSDN, disponible bajo la licencia de Apache, versión 2.0).

También puede usar Qt String multiplataforma que define las funciones de conversión de UTF8 a/desde UTF16 y otras codificaciones (ANSI, latín ...).

Así que la respuesta anterior - en Unix siempre use UTF8 (std :: string, char), en Windows UTF16 (std :: wstring, wchar_t) es verdadera.

+0

Entonces, ¿qué propones que haga cuando quiero hacer un compilador/intérprete de lenguaje que trate todo como UTF-8 en ambos sistemas? – Lanbo

+0

Bueno, no hay una respuesta simple y una solución "definitiva". Depende de qué compiladores, IDEs y API usas. Le recomendaría utilizar algún marco de aplicación multiplataforma, idealmente Qt de Nokia - http://qt.nokia.com. Es completamente gratuito para proyectos de código abierto e incluso para comerciales, si garantiza el cumplimiento de la Licencia Pública General de GNU (LGPL). – vitakot

3

Recuerde que al inicio del programa principal, la configuración regional "C" se selecciona de manera predeterminada. Probablemente no quieras esto si manejas utf-8. Llamar a setlocale(LC_CTYPE, "") desactiva este valor predeterminado, y obtiene lo que se define en el entorno (probablemente una configuración regional utf-8).

+1

¡Sí! Contrariamente a otras respuestas, está perfectamente bien usar 'wchar_t' en Linux. Sin embargo, debes usar la configuración correcta. –