2010-05-19 2 views
20

Me preguntaba si existe un método recomendado 'cruzado' de Windows y Linux para convertir cadenas de UTF-16LE a UTF-8. o uno debe usar diferentes métodos para cada entorno?Convierta UTF-16 a UTF-8 en Windows y Linux, en C

He logrado google algunas referencias a 'iconv', pero para somreason no puedo encontrar ejemplos de conversiones básicas, como - la conversión de un wchar_t UTF-16 a UTF-8.

Cualquiera puede recomendar un método que sería 'cruzado', y si conoce referencias o una guía con muestras, lo agradecería mucho.

Gracias, Doori Bar

+0

Ver esta pregunta anterior: http://stackoverflow.com/questions/148403/utf8-to-from-wide-char-conversion-in- stl –

+0

Gracias Mark, pero me temo que es demasiado bajo para mí. – DooriBar

Respuesta

0

Gracias chicos, así es como he conseguido resuelve el requisito de 'cruces' de Windows y Linux:

  1. descargado e instalado: MinGW y MSYS
  2. descargado el paquete libiconv fuente
  3. libiconv Compilado por medio MSYS.

Eso es todo.

3
wchar_t *src = ...; 
int srclen = ...; 
char *dst = ...; 
int dstlen = ...; 
iconv_t conv = iconv_open("UTF-8", "UTF-16"); 
iconv(conv, (char*)&src, &srclen, &dst, &dstlen); 
iconv_close(conv); 
+1

Supongo que "UTF-16" y "UTF-8" deberían cambiar de lugar. – DooriBar

+0

Buena captura ..... –

2

También hay utfcpp, que es una biblioteca de solo cabecera.

3

se han topado con este problema también, lo resuelvo mediante el uso de boost locale library

try 
{   
    std::string utf8 = boost::locale::conv::utf_to_utf<char, short>(
         (short*)wcontent.c_str(), 
         (short*)(wcontent.c_str() + wcontent.length())); 
    content = boost::locale::conv::from_utf(utf8, "ISO-8859-1"); 
} 
catch (boost::locale::conv::conversion_error e) 
{ 
    std::cout << "Fail to convert from UTF-8 to " << toEncoding << "!" << std::endl; 
    break; 
} 

El impulso :: Locale :: :: conv utf_to_utf función de tratar de convertir de un búfer que codificado por UTF 16LE a UTF-8, La función boost :: locale :: conv :: from_utf intenta convertir desde un búfer codificado por UTF-8 a ANSI, asegúrese de que la codificación sea correcta (Aquí uso la codificación para América Latina). 1, ISO-8859-1).

Otro recordatorio es que en Linux std :: wstring tiene 4 bytes de longitud, pero en Windows std :: wstring tiene 2 bytes de longitud, por lo que sería mejor no usar std :: wstring para contener el buffer UTF-16LE.

6

Cambio de codificación UTF-8 con PowerShell:

powershell -Command "Get-Content PATH\temp.txt -Encoding Unicode | Set-Content -Encoding UTF8 PATH2\temp.txt" 
+0

Funciona muy bien en Windows 2008 R2. BOM también se agrega. –

Cuestiones relacionadas