¿Cómo establecer el conjunto de caracteres en tiempo de ejecución en C?

¿Cómo configurar el conjunto de caracteres en tiempo de ejecución en el lenguaje de progtwigción C, en un entorno Linux?

Por ejemplo, quiero configurarlo en iso8859-1, utf-8 o ascii.

Lo que hace printf( "%c", '\xa3') es siempre lo mismo: envía un byte con el valor 0xA3 (= 163) al flujo de salida estándar.

Lo que luego se muestra en su pantalla depende de cómo reaccione su terminal (por ejemplo, xterm o la consola de Linux) al ver un byte con un valor 163 escrito en él. Esa es una cuestión de la configuración de caracteres de su terminal , y no hay una manera directa en que su progtwig C pueda influenciarlo. Lo que debe hacer es permitir que el progtwig C descubra qué conjunto de caracteres espera el terminal y luego generar una salida que coincida con eso.

Los progtwigs simples a menudo pueden salirse con la suya asumiendo que el conjunto de caracteres en el que se encuentra su entrada es también el conjunto de caracteres en el que se espera que esté su salida, y luego simplemente ignoran los problemas del conjunto de caracteres y simplemente reproducen los bytes de bits altos en su salida exactamente como aparecieron en la entrada. (La encoding UTF-8 de Unicode está diseñada deliberadamente para hacer que esta estrategia funcione en muchos casos).

Sin embargo, cuando ese no es el caso, por ejemplo, si su progtwig contiene una cadena codificada con letras que no están en inglés, necesita usar las funciones de configuración regional para averiguar qué encoding de caracteres se supone que debe producir su progtwig, y ​​luego asegúrese de Haz eso. Las bibliotecas como libiconv a menudo pueden ayudar con esto de forma relativamente sencilla.

Necesitas ser un poco más específico sobre lo que quieres decir. En su mayor parte, C no tiene realmente un conjunto de caracteres; sus cadenas son simplemente cadenas de bytes delimitadas por nulos, y no hacen nada para codificarlas o descodificarlas.

Hay algunas funciones en la biblioteca estándar de C y en POSIX que dependen de la configuración regional actual. Puede usar use setlocale para establecer la configuración regional actual; su valor predeterminado es la configuración regional C, en la que las cadenas se tratan como ASCII y se comparan de acuerdo con los valores de bytes.

Si quieres convertir juegos de caracteres, usa iconv ; esto te permitirá convertir los buffers de una encoding a otra. Por ejemplo, si representa su texto internamente en UTF-8, pero desea imprimirlo en ISO-8859-1, esto es lo que usaría.

Editar para agregar : De un comentario en otra respuesta, usted pregunta:

Establecí el conjunto de caracteres esperado de mi terminal en “ISO 8859-1”, pero ¿por qué cuando llamo a la función setlocale( LC_CTYPE, NULL ); , todavía devuelve C ? Creo que debería devolver ISO 8859-1 ya que este es el conjunto de caracteres esperado del terminal.

Cuando el progtwig se inicia, su configuración regional es siempre “C”. Si desea establecer la configuración regional según las variables de entorno, debe llamar a setlocale( LC_ALL, "") o a setlocal( LC_CTYPE, "") ; es decir, debe pasar una cadena vacía, y luego la configuración regional se establecerá en función de sus variables de entorno.

Consulte setlocale(3) , que establece la configuración regional actual del progtwig.

Estándar C proporciona la función setlocale() para establecer una configuración regional. El valor para LC_CTYPE define el tipo de carácter. Para algunos detalles más finos, también vea lo que POSIX tiene que decir. Para averiguar las configuraciones regionales admitidas en su sistema, ejecute

 locale -a