c++ - salen - detectar codificacion online
¿Cómo se lee un archivo codificado en UTF-8 que contiene caracteres chinos y se los da salida correctamente en la consola? (3)
Estoy escribiendo un rastreador web para buscar algunos archivos web chinos. Los archivos recuperados están codificados en utf-8. Y necesito leer esos archivos para hacer un análisis, como extraer las URL y los caracteres chinos. Pero descubrí que cuando leía el archivo en una variable std :: string y lo enviaba a la consola, los caracteres chinos se convertían en caracteres basura. Apliqué el boost :: regex en la variable std :: string y puedo extraer todas las URL pero caracteres chinos.
¿Cómo puedo resolver esos problemas?
PD Mis archivos CPP están codificados como ANSI por defecto, el sistema operativo es Win8 en idioma chino;
En general, use las w
variantes, ( wstring
, wfstream
, wcout
), configure sus configuraciones regionales para que coincidan con los requisitos, cuelgue una L
en la parte frontal de los literales de cadena. locale::global(locale(""))
se configura para coincidir con el valor predeterminado del entorno, luego en cada flujo que no se ejecuta de acuerdo con ese valor predeterminado, por ejemplo, wcout.imbue(locale("Chinese_China.936"))
podría ser el nombre de Microsoft para la configuración regional de su terminal. Esto siempre ha sido suficiente para hacer lo que quiero, espero que funcione también para ti.
#include <iostream>
#include <locale>
using namespace std;
int main() {
locale::global(locale(""));
wstring word;
while (wcin >>word)
wcout<<word<<''/n'';
wcout<<L"好運n";
}
si necesita mostrar los caracteres correctamente, puede usar libiconv desde GNU. si solo necesita procesar urls, std :: string funciona bien. el problema es la página de códigos de la consola de Windows, no la cadena en sí. use locale depende de la implementación de os y stdc ++ lib, por lo que no recomiendo usarlo.
MultiByteToWideChar de Windows puede ayudar, pero debe verificar las especificaciones de MS sobre cómo funcionan las funciones para realizar conversiones en cadenas.
Este código puede ayudar (fue compilado con VC ++ 2010). Lo probé con un archivo UTF-8 que contiene caracteres no latinos y parece funcionar, pero no sé si funcionará bien con caracteres chinos. Consulte los siguientes enlaces para obtener más información: _setmode y codecvt_utf8 .
#include <iostream>
#include <fstream>
#include <string>
#include <locale>
#include <codecvt>
#include <fcntl.h>
#include <io.h>
using namespace std; // Sorry for this!
void read_all_lines(const wchar_t *filename)
{
wifstream wifs;
wstring txtline;
int c = 0;
wifs.open(filename);
if(!wifs.is_open())
{
wcerr << L"Unable to open file" << endl;
return;
}
// We are going to read an UTF-8 file
wifs.imbue(locale(wifs.getloc(), new codecvt_utf8<wchar_t, 0x10ffff, consume_header>()));
while(getline(wifs, txtline))
wcout << ++c << L''/t'' << txtline << L''/n'';
wcout << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
// Console output will be UTF-16 characters
_setmode(_fileno(stdout), _O_U16TEXT);
if(argc < 2)
{
wcerr << L"Filename expected!" << endl;
return 1;
}
read_all_lines(argv[1]);
return 0;
}
Si los caracteres chinos no se ven como se esperaba, asegúrese de que la consola esté usando una fuente que admita UTF-16 (es decir, no use fuentes de mapa de bits).