¿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.