2010-10-20 4 views
0

J'utilise libcurl pour récupérer des pages HTML.Comment convertir ISO-8859-1 en UTF-8 en utilisant libiconv en C++

Les pages HTML contiennent des références de caractères comme: סלקום

Quand je lis cela en utilisant libxml2 je reçois: «₪'¨'~'»

est-il l'ISO-8859-1 codage?

Si oui, comment puis-je le convertir en UTF-8 pour obtenir le mot correct.

Merci

EDIT: Je me suis la solution, MSalters avait raison, libxml2 n'utilise UTF-8.

Je a ajouté à eclipse.ini

-Dfile.encoding = utf-8

et enfin je suis arrivé caractères hébraïques sur ma console Eclipse. Merci

+4

Il ne peut pas être ISO-8859-1 car il ne comporte que des caractères compris entre 0 et 255. 1493-1505 ne se trouvent pas dans cette plage (évidemment). –

+0

Avez-vous des suggestions quel serait-il? et comment puis-je le convertir en UTF-8? – embedded

+1

Les références de caractères numériques doivent provenir du jeu de caractères du document susceptible d'être unicode.Cela n'a rien à voir avec le système de codage de caractères utilisé. –

Répondre

3

Avez-vous vu le libxml2 page on i18n? Il explique comment libxml2 résout ces problèmes.

Vous obtiendrez un ס à partir de libxml2. Cependant, vous avez dit que vous obtenez quelque chose comme ׳₪׳¨׳˜׳ ׳¨. Pourquoi penses-tu que tu as ça? Vous obtenez un XMLchar*. Comment avez-vous converti ce pointeur dans la chaîne ci-dessus? Avez-vous utilisé un débogueur? Ce débogueur sait-il comment afficher un XMLchar*? Mon pari est que le XMLchar* est correct, mais vous avez utilisé un débogueur qui ne peut pas rendre l'Unicode dans un XMLchar*

Pour répondre à votre dernière question, un XMLchar* est déjà UTF-8 et ne nécessite aucune autre conversion.

+0

Je viens d'imprimer le xmlchar * en utilisant cout et j'ai obtenu '₪'¨'''''¨ Comment puis-je l'imprimer correctement? – embedded

+1

'std :: cout' utilisera les paramètres régionaux en cours. Si ce n'est pas un paramètre régional UTF-8 (très probable), cela ne fonctionnera pas du tout. 'std :: wcout' peut généralement imprimer Unicode, mais il attend' wchar_t * 'pas' XMLchar * 'de libxml. – MSalters

0

Non. Ces entités correspondent à la valeur décimale du numéro de séquence Unicode de vos caractères. Voir this page par exemple.

Vous pouvez donc stocker vos valeurs Unicode sous la forme int et utiliser un algorithme pour transformer ces entiers en caractères multi-octets UTF-8. Voir la spécification UTF-8 pour cela.

+0

Non nécessaire, libxml2 le fait déjà. C'est ainsi qu'il a obtenu les caractères non-ASCII en premier lieu. – MSalters

0

Cette réponse a été donnée dans l'hypothèse que le texte codé est retourné comme UTF-16, ce qui, comme il s'avère, n'est pas le cas.


Je suppose que l'encodage est UTF-16 ou UCS2. Spécifiez ceci comme entrée pour iconv. Il pourrait aussi être un problème endian, consultez here


La façon dont c style serait (pas de vérification pour plus de clarté):

iconv_t ic = iconv_open("UCS-2", "UTF-8"); 
iconv(ic, myUCS2_Text, inputSize, myUTF8-Text, outputSize); 
iconv_close(ic); 
+0

Ceux-ci devraient représenter les caractères hébreux. mais maintenant je ne comprends pas. quelle serait la bonne façon d'utiliser iconv? – embedded

+0

Comment dois-je déclarer myUTF8-Text? Ce code ne fonctionne pas pour moi: (le programme plante) 'char ibuf [] =" '¡'? '' ''? char obuf [512]; it = iconv_open ("UCS-2", "UTF-8"); Iconv (it, (char **) ibuf, & il, (char **) & obuf, & ol) ' – embedded

+0

Vous avez initialisé il et ol? Passez "& ibuf" au lieu de "ibuf" – stefaanv