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
7 réponses
Si vous ne voulez pas utiliser ICU,
- Windows: WideCharToMultiByte
- Linux: iconv (Glibc)
Changer l'encodage en UTF-8 avec PowerShell:
powershell -Command "Get-Content PATH\temp.txt -Encoding Unicode | Set-Content -Encoding UTF8 PATH2\temp.txt"
La bibliothèque open source ICU est très couramment utilisée.
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.
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);
Il y a aussi utfcpp , qui est une bibliothèque d'en-tête uniquement.
Merci Les gars, voici comment j'ai réussi à résoudre l'exigence' cross ' windows et linux:
- Téléchargé et installé:
MinGW
, etMSYS
- téléchargé le paquet source
libiconv
- Compilé
libiconv
parMSYS
.
C'est à peu près tout.