Saludos,
- Tienes que buscar la compatibilidad de codificación entre el fichero de código fuente y la terminal de destino.
- Por ejemplo la codificación de caracteres de
CMD es
OEM (CP-850) para sistemas Windows Español. Esto significa que si guardas tu .cpp y/o ficheros con contenido bajo esa codificación no deberías de tener ningún problema ni tendrías que importar ninguna biblioteca externa (
<locale.h>).
- En este ejemplo voy a utilizar Notepad3 el cual me permite elegir entre muchas codificaciones, dentro de las cuales está OEM CP-850 que es la que utiliza CMD por defecto en Español:
C:\Users\EdSon\Desktop>type lecto_escritura.cpp
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ofstream salida;
ifstream entrada;
salida.open("file.txt");
salida << "ñandú";
salida.close();
string txt;
entrada.open("file.txt");
entrada >> txt;
entrada.close();
cout << txt;
return 0;
}
C:\Users\EdSon\Desktop>g++ lecto_escritura.cpp -o lecto_escritura.exe && lecto_escritura.exe
ñandú
C:\Users\EdSon\Desktop>type file.txt
ñandú
-- Nótese que la consola me muestra correctamente la
ñ y
ú cuando leo los archivos con
type, esto porque están guardados bajo la codificación OEM CP-850 y CMD no tiene problema en leerlos e interpretarlos.
- PERO esa codificación no es estándar, es más SublimeText no la trae, y Notepad++ no la detecta automáticamente XD. Entonces se puede hacer uso de
<locale.h> para adaptarse a la codificación destino utilizando una codificación más estándar. Pero en caso de CMD no se puede usar UTF-8 que es el estándar actual, CMD no la soporta completa, CMD a lo sumo solo soporta ANSI.
-- La mejor alternativa parece ser ANSI (CP-1252), este es bastante estándar. Entonces sigo con el ejemplo, en este caso guardo mi archivo
.cpp bajo la codificación ANSI o CP-1252 o Windows 1252 o como lo tenga definido el editor de texto:
C:\Users\EdSon\Desktop>type lecto_escritura.cpp
#include <iostream>
#include <fstream>
#include <locale>
using namespace std;
int main() {
setlocale(LC_ALL, "Spanish");
ofstream salida;
ifstream entrada;
salida.open("file.txt");
salida << "±and·";
salida.close();
string txt;
entrada.open("file.txt");
entrada >> txt;
entrada.close();
cout << txt;
return 0;
}
C:\Users\EdSon\Desktop>g++ lecto_escritura.cpp -o lecto_escritura.exe && lecto_escritura.exe
ñandú
C:\Users\EdSon\Desktop>type file.txt
±and·
-- Nótese que
type me muestra caracteres extraños para
ñandú pero al compilar y ejecutar el programa no hay problemas para mostrar correctamente
ñandú