2009-04-24 22 views
10

Estoy intentando cosas salida como 안, 蠀, ☃ de Cunicode hola mundo para C?

#include <wchar.h> 
int main() 
{ 
    fwprintf(stdout, L"안, 蠀, ☃\n"); 
    return 0; 
} 

salida es?,?,?

¿Cómo imprimo esos caracteres?

Editar:

#include <wchar.h> 
#include <locale.h> 
int main() 
{ 
    setlocale(LC_CTYPE, ""); 
    fwprintf(stdout, L"안, 蠀, ☃\n"); 
    return 0; 
} 

este hizo el truco. la salida es 안, 蠀, ☃. excepto que el personaje chino y el muñeco de nieve aparecen como una caja en mi urxvt probablemente porque no habilité esas configuraciones regionales.

$ locale -a 
C 
en_US 
en_US.iso88591 
en_US.iso885915 
en_US.utf8 
ja_JP.utf8 
ko_KR 
ko_KR.euckr 
ko_KR.utf8 
korean 
korean.euc 
POSIX 
zh_CN.utf8 

que localidad tengo que habilitar de forma adicional para que se muestren caracteres chinos y muñecos de nieve? tal vez necesito la fuente?

¿funcionará el programa anterior en Windows?

+0

¿Estás usando Windows o Linux? – Zifre

+0

maldición, algo está mal en mi computadora porque veo también esos? en la muestra de código! – alvatar

+4

Intenta configurar la codificación en Unicode (UTF-8) (en Firefox, Ver-> Codificación de caracteres) –

Respuesta

1

Tiene que configurar su sistema para aceptar esos caracteres. ¿Que estas usando? Windows, Linux?

+0

estoy usando linux. $ locale todo en en_US.utf8 – numeric

9

Tiene que configurar su terminal de salida como compatible con Unicode.

En Linux (con Bash shell), trate de:

$ LANG=en.UTF-8 

y también asegurarse de que el emulador de terminal en realidad puede mostrar Unicode y está configurado para hacerlo.

4

El C wchar_t se define como:

Tipo wchar_t es un tipo distinto cuyos valores pueden representar códigos distintos para todos los miembros de la mayor conjunto de caracteres ampliado especificada entre las localizaciones soportadas (22.1.1). [...]

La diferencia entre los caracteres de varios bytes y wchar_t:

caracteres de varios bytes pueden requerir más de un byte de un carácter determinado en función de la codificación (por ejemplo: UTF-8, UTF 16)

mientras que

wchar_t tiene un tamaño fijo es decir siz eof (wchar_t) que es implementación definida. Tenga en cuenta que este ancho define qué codificación (s) puede admitir su wchar_t. Por lo tanto, si sizeof(wchar_t) == 2 no hay forma de que pueda usar la codificación UTF-32.

También recuerde que wchar_t no tiene un sentido de codificación por sí mismo. Primero tendría que decirle al compilador qué tipo de codificación debe usar para los datos wchar_t. La salida errónea probablemente se deba a que los caracteres están siendo tratados con la codificación predeterminada que no admite esos caracteres correctamente y una coincidencia fallida conduce a un estilo 'notdef' '?' salida.

+0

wchar_t no es necesariamente multibyte, puede ser de un byte de longitud. –

+0

Bueno, sí, debería haber sido más pedante :-) – dirkgently

6

Hay muchas etapas individuales en el proceso de obtener una salida Unicode, todas las cuales deben estar configuradas correctamente.

En primer lugar, ¿está compilando con soporte Unicode habilitado? Deberá hacerlo en Windows (-D UNICODE -D __UNICODE).

En segundo lugar, ¿está emitiendo a una línea de comandos que admite unicode, ambos en principio pero también tienen una fuente que contiene los glifos de los caracteres que está emitiendo?

En tercer lugar, ¿las codificaciones Unicode utilizadas por tu compilador y tu línea de comando coinciden? de nada sirve tener UCS2 en tu binario cuando tu línea de comando esperaba UTF8.

Básicamente es necesario comprender realmente Unicode y sus codificaciones, para hacerlo bien. No imagine que es sencillo o no necesita aprender todos los conceptos subyacentes; esto no funciona por accidente porque hay demasiadas cosas que tienen que ser exactamente correctas.

0

Al igual que Alnitak sugirió, uno tiene que especificar una configuración regional con un conjunto de caracteres/codificación que incluya los caracteres que desea mostrar. (Unicode /) UTF-8 debe cubrir todos los caracteres Unicode.

Su terminal debe usar una fuente que tenga glifos respectivos.

Windows 'CMD.EXE es notoriamente débil cuando se trata de conjuntos de caracteres más allá de 8 bits. Tal vez, necesitaría un panel de GUI en lugar de confiar en stdout.

Cuestiones relacionadas