web-dev-qa-db-fra.com

Conversion de UTF-16 à UTF-8 sous Windows et Linux, en C

Je me demandais s'il existait une méthode Windows et Linux "croisée" recommandée dans le but de convertir des chaînes d'UTF-16LE en UTF-8? ou faut-il utiliser des méthodes différentes pour chaque environnement?

J'ai réussi à rechercher sur Google quelques références à 'iconv', mais je ne peux pas trouver un échantillon de conversions de base tel que - la conversion d'un wchar_t UTF-16 en UTF-8.

N'importe qui peut recommander une méthode qui serait «croisée», et si vous connaissez des références ou un guide avec des échantillons, l'apprécieriez beaucoup.

Merci, Doori Bar

23
DooriBar

Merci les gars, voici comment j'ai réussi à résoudre l'exigence 'cross' entre Windows et Linux:

  1. Téléchargé et installé: MinGW, et MSYS
  2. Téléchargé le paquet source libiconv
  3. Compilé libiconv via MSYS.

C'est à peu près ça.

0
DooriBar

Si vous ne voulez pas utiliser ICU,

  1. Windows: WideCharToMultiByte
  2. Linux: iconv (Glibc)
6
Alex B

Changez le codage en UTF-8 avec PowerShell: 

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

La bibliothèque open source ICU est très couramment utilisée.

5
Hans Passant

J'ai rencontré ce problème aussi, je le résous en utilisant boost bibliothèque locale

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

La fonction boost :: locale :: conv :: ut :: _fut_to_utf tente de convertir un tampon encodé par UTF-16LE en UTF-8, Le boost :: locale :: conv :: from_utf essayez de convertir un tampon encodé par UTF-8 en ANSI, assurez-vous que le codage est correct (ici, j’utilise le codage pour Latin-1, ISO-8859-1).

Un autre rappel est que, dans Linux, std :: wstring a une longueur de 4 octets, mais que dans Windows, std :: wstring a une longueur de 2 octets. Il est donc préférable de ne pas utiliser std :: wstring pour contenir le tampon UTF-16LE.

5
Daniel King
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);
4
Remy Lebeau

Il y a aussi utfcpp , qui est une bibliothèque en-tête uniquement.

2
Kevin Smyth