Convierta UTF-16 a UTF-8 bajo Windows y Linux, en C

2 minutos de lectura

avatar de usuario
PuertaiBar

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

Logré buscar en Google algunas referencias a ‘iconv’, pero por alguna razón no puedo encontrar muestras de conversiones básicas, como convertir un wchar_t UTF-16 a UTF-8.

Cualquiera puede recomendarme un método que sería ‘cruzado’, y si sabe de referencias o una guía con ejemplos, se lo agradecería mucho.

Gracias, Doori Bar

  • Consulte esta pregunta anterior: stackoverflow.com/questions/148403/…

    – Mark Ransom

    20 de mayo de 2010 a las 2:13

  • Gracias Mark, pero me temo que es un nivel demasiado bajo para mí.

    – DooriBar

    20 de mayo de 2010 a las 12:33

avatar de usuario
usuario4657497

Cambie la codificación a UTF-8 con PowerShell:

Get-Content PATH\temp.txt -Encoding Unicode | Set-Content -Encoding UTF8 PATH2\temp.txt

  • Funciona muy bien en Windows 2008 R2. También se agrega BOM.

    – Mari B.

    4 oct 2016 a las 11:51

Si no desea utilizar la UCI,

  1. Ventanas: WideCharToMultiByte
  2. Linux: iconov (Glibc)

el código abierto biblioteca de la UCI se usa muy comunmente.

avatar de usuario
Rémy Lebeau

#include <iconv.h>

wchar_t *src = ...; // or char16_t* on non-Windows platforms
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);

También me he encontrado con este problema, lo resuelvo usando aumentar la biblioteca local

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;
}

los impulso::locale::conv::utf_to_utf función intente convertir de un búfer codificado por UTF-16LE a UTF-8, el impulso::locale::conv::from_utf intente convertir de un búfer codificado por UTF-8 a ANSI, asegúrese de que la codificación sea correcta (aquí uso la codificación para Latin-1, ISO-8859-1).

Otro recordatorio es que en Linux std::wstring tiene una longitud de 4 bytes, pero en Windows std::wstring tiene una longitud de 2 bytes, por lo que es mejor que no use std::wstring para contener el búfer UTF-16LE.

avatar de usuario
milímetro

Si tiene MSYS2 instalado, entonces el iconv paquete (que se instala de forma predeterminada) le permite utilizar:

 iconv -f utf-16le -t utf-8 <input.txt >output.txt

avatar de usuario
kevin smyth

También hay utfcppque es una biblioteca de solo encabezado.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad