GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué wprintf translitera el texto ruso en Unicode al latín en Linux?

¿Por qué translitera el texto ruso en Unicode al latín en lugar de transcodificarlo a UTF-8 o usar caracteres de reemplazo?

Debido a que la configuración regional inicial de su programa es la predeterminada, el C lugar. Entonces está traduciendo una cadena ancha a C lugar. C locale no maneja UTF-8 ni unicode, por lo que su biblioteca estándar hace lo mejor para traducir caracteres anchos en algún conjunto de caracteres básico utilizado en C configuración regional.

Puede cambiar la configuración regional a cualquiera Configuración regional UTF-8 y el programa debe generar una cadena UTF-8.

Nota:(en la implementación que conozco) la codificación del FILE la transmisión se determina y guarda en ese momento se elige la orientación de la corriente (ancha frente a normal). Recuerde establecer la configuración regional antes haciendo cualquier cosa con stdout (es decir, esto frente a esto).


Porque la conversión de caracteres anchos se realiza de acuerdo con la configuración regional actual. De forma predeterminada, un programa C siempre comienza con una configuración regional "C" que solo admite caracteres ASCII.

Primero debe cambiar a cualquier idioma ruso o UTF-8:

setlocale(LC_ALL, "ru_RU.utf8"); // Russian Unicode
setlocale(LC_ALL, "en_US.utf8"); // English US Unicode

O a una configuración regional actual del sistema (que es probablemente lo que necesita):

setlocale(LC_ALL, "");

El programa completo será:

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main() {
  setlocale(LC_ALL, "ru_RU.utf8");
  wprintf(L"Привет, мир!\n");
}

En cuanto a que su código funcione tal como está en otras máquinas, esto se debe a cómo funciona libc allí. Algunas implementaciones (como musl) no admiten configuraciones regionales que no sean Unicode y, por lo tanto, pueden traducir incondicionalmente caracteres anchos a una secuencia UTF-8.


Linux
  1. Linux – ¿Por qué Linux permite ‘init=/bin/bash’?

  2. Linux:¿por qué no funciona Setuid?

  3. Linux:¿por qué Rsync en Linux no conserva todas las marcas de tiempo (hora de creación)?

  4. ¿Por qué Ctrl + V no se pega en Bash (shell de Linux)?

  5. ¿Por qué esta expresión regular no funciona en Linux?

¿Qué es el comando Grep en Linux? ¿Por qué se usa y cómo funciona?

¿Por qué el preprocesador de C interpreta la palabra linux como la constante 1?

¿Por qué rand() repite números con mucha más frecuencia en Linux que en Mac?

¿Por qué Windows no reconoce los archivos dentro de las particiones de Linux?

¿Por qué clang genera texto ininteligible cuando se redirige?

¿Por qué mi sistema Linux tartamudea a menos que descarte cachés continuamente?