Convertir UTF-16 en UTF-8 sous Windows et Linux, en C

Je me demandais s'il y avait une méthode 'cross' Windows et Linux recommandée dans le but de convertir des chaînes de UTF-16LE en UTF-8? ou on devrait utiliser des méthodes différentes pour chaque environnement?

J'ai réussi à google quelques références à 'iconv', mais pour somreason Je ne peux pas trouver des exemples de conversions de base, telles que - convertir un wchar_t UTF-16 en UTF-8.

N'importe qui peut recommander une méthode qui serait "la croix", et si vous connaissez des références ou un guide avec des échantillons, serait très apprécier.

Merci, DOORI Bar

22
demandé sur hippietrail 2010-05-19 19:48:00

7 réponses

Si vous ne voulez pas utiliser ICU,

  1. Windows: WideCharToMultiByte
  2. Linux: iconv (Glibc)
6
répondu Alex B 2010-05-20 02:08:29

Changer l'encodage en UTF-8 avec PowerShell:

powershell -Command "Get-Content PATH\temp.txt -Encoding Unicode | Set-Content -Encoding UTF8 PATH2\temp.txt"
6
répondu user4657497 2015-03-11 09:27:02

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

5
répondu Hans Passant 2010-05-19 18:57:35

J'ai aussi rencontré ce problème, je le résous en utilisant 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;
}

La fonction boost:: locale:: conv:: utf_to_utf essaie de convertir à partir d'un tampon encodé par UTF-16LE en UTF-8, La fonction boost:: locale:: conv:: from_utf essaie de convertir à partir d'un tampon encodé par UTF-8 EN ANSI, assurez-vous que l'encodage est correct(ici j'utilise l'encodage pour Latin-1, ISO-8859-1).

Un autre rappel est, dans Linux std:: wstring est de 4 octets de long, mais dans Windows std:: wstring a une longueur de 2 octets, vous feriez donc mieux de ne pas utiliser std::wstring pour contenir le tampon UTF-16LE.

5
répondu Daniel King 2013-12-04 04:37:29
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
répondu Remy Lebeau 2014-07-24 11:31:22

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

2
répondu Kevin Smyth 2012-10-12 17:19:23

Merci Les gars, voici comment j'ai réussi à résoudre l'exigence' cross ' windows et linux:

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

C'est à peu près tout.

0
répondu DooriBar 2014-06-26 12:49:12