2010-05-19 4 views
20

Je me demandais s'il existe une méthode «croisée» Windows et Linux pour convertir des chaînes UTF-16LE en UTF-8? ou on devrait utiliser des méthodes différentes pour chaque environnement?Convertir UTF-16 en UTF-8 sous Windows et Linux, en C

J'ai réussi à trouver quelques références à 'iconv', mais pour une raison ou pour une autre, je ne trouve pas d'exemples de conversions de base, comme - convertir un UCC-UTF-16 en UTF-8.

Tout le monde peut recommander une méthode qui serait «croisée», et si vous connaissez des références ou un guide avec des échantillons, apprécierait beaucoup.

Merci, Bar Doori

+0

Voir cette question précédente: http://stackoverflow.com/questions/148403/utf8-to-from-wide-char-conversion-in- stl –

+0

Merci Mark, mais j'ai peur que ce soit trop bas pour moi. – DooriBar

Répondre

0

Merci les gars, voilà comment je réussi à Résolvez les conditions de 'croix' et de Linux:

  1. téléchargement et l'installation: MinGW et MSYS
  2. téléchargé le paquet source libiconv
  3. compilé libiconv via MSYS.

C'est à peu près tout.

5

L'open source ICU library est très couramment utilisé.

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

Je suppose que "UTF-16" et "UTF-8" devraient changer de place. – DooriBar

+0

Bonne capture ..... –

2

Il existe également utfcpp, qui est une bibliothèque en-tête uniquement.

3

J'ai couru dans ce problème aussi, je l'ai résolu 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; 
} 

Le boost :: :: locale conv :: utf_to_utf fonction essayer de convertir un tampon codé par UTF- 16LE à UTF-8, La fonction boost :: locale :: conv :: from_utf tente de convertir à partir d'un tampon codé 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, sous Linux, que std :: wstring a une longueur de 4 octets, mais dans Windows, std :: wstring a une longueur de 2 octets, donc mieux vaut ne pas utiliser std :: wstring pour contenir le tampon UTF-16LE.

6

Modifier l'encodage UTF-8 avec PowerShell:

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

Fonctionne très bien sur Windows 2008 R2. La nomenclature est également ajoutée. –

Questions connexes