IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Framework .NET Discussion :

Problème d'affichage de certain caractère UTF-8


Sujet :

Framework .NET

  1. #1
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut Problème d'affichage de certain caractère UTF-8
    Bonjour,

    Je dois faire de l'extraction de donnée à partir d'un site web, ce site est en encodé en UTF-8.

    Pour 95% des caractères spéciaux je les décodes sans problèmes via :
    Code CS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static String UTF8Decode( String sText )
    {
    	Byte[] utf8Bytes = new Byte[ sText.Length ];
     
    	for ( int i = 0; i < sText.Length; ++i )
    	{
    		utf8Bytes[ i ] = ( Byte )sText[ i ];
    	}
     
    	return Encoding.UTF8.GetString( utf8Bytes, 0, utf8Bytes.Length );//.ToString();
    }

    Que j'utilise de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UTF8Decode( System.Net.WebUtility.HtmlDecode( sInnerText ) )
    Or c'est suffisant pour la plus part des caractères mais pas pour :
    "Maḥfūẓ, Najīb" <= Dans ce cas seul le "z pointé" fail.
    Et je vois "�"

    Je soupçonne le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    utf8Bytes[ i ] = ( Byte )sText[ i ];
    parce qu'en UTF-8 un caractère fait 8, 16 ou 32 bits et pas toujours un Bytes... J'ai essayé de convertir la source en UTF16/Unicode... Mais rien n'y fait...

    Le code est en C#, mais c'est la même chose quelque soit le langage .NET.

    Merci

  2. #2
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Est-ce que ce bout de code trouvé très facilement répond à la question ?
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static string Utf16ToUtf8(string utf16String)
    {
        // Get UTF16 bytes and convert UTF16 bytes to UTF8 bytes
        byte[] utf16Bytes = Encoding.Unicode.GetBytes(utf16String);
        byte[] utf8Bytes = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, utf16Bytes);
     
        // Return UTF8 bytes as ANSI string
        return Encoding.Default.GetString(utf8Bytes);
    }

    Après attention, un String en DotNet est, me semble-t-il, en UTF-16 (Unicode) quoi qu'il arrive. L'encodage intervient lorsque des octets (byte[]) sont issus d'une chaîne de caractères. Voir l'aide sur Encoding.Convert().
    "Si vous voulez être l’esclave des banques et payer pour financer votre propre esclavage, alors laissez les banquiers créer la monnaie" - Josiah Stamp, 1920, Gouverneur de la Banque d’Angleterre
    "Qui ne peut acheter ruine qui voudrait vendre" - Jacques Duboin.
    "Nous n'héritons pas la terre de nos parents, nous l'empruntons à nos enfants." - Antoine de Saint Exupéry

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Moi ce qui me semble louche c'est que tu aies besoin de cette fonction UTF8Decode, car ce type de fonction n'a pas vraiment de sens en .NET.

    A partir du moment où tu manipules du texte sous forme de string, tu n'es plus supposé avoir à te préoccuper de l'encodage. En interne, une string en .NET est toujours en UTF-16, mais c'est juste un détail d'implémentation, tu n'as généralement pas besoin d'en tenir compte ; là où tu dois te préoccuper de l'encodage, c'est lorsque tu lis du texte depuis un flux binaire (ou que tu écris vers un flux binaire). Si le texte dans la string en entrée de la méthode n'est pas bon, c'est qu'au départ il n'a pas été lu avec le bon encodage, et donc tu as déjà perdu des données : aucune conversion ne pourra récupérer des données perdues...

    A mon avis, tu as lu le contenu de la page web avec l'encodage ISO-8859-1 alors qu'en fait c'est de l'UTF-8 (ou inversement). Il faut régler le problème en amont, au niveau de la lecture du texte, car une fois que c'est une string, il est trop tard pour régler le problème.

  4. #4
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut
    Et bien merci !
    Le code ne change rien parce que cela venait de l'Input.
    Comme on dit "Shit In => Shit Out"

    Je téléchargeait la page web via :
    System.Net.WebClient.DownloadString Or je n'avais pas spécifié l'encodage.
    Maintenant que j'ai fais :
    Code cs : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WebClient oWebClient = new WebClient();
    oWebClient.Encoding = Encoding.UTF8;
    sWebPageContent	=	oWebClient.DownloadString( sCurrentURL );

    Tout va mieux...

    [Résolu]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/03/2014, 21h37
  2. [Ecran] Problème d'affichage de certaine couleur
    Par virgul dans le forum Périphériques
    Réponses: 1
    Dernier message: 24/09/2007, 15h35
  3. Problème d'affichage des caratères non UTF-8
    Par tit_pierre dans le forum Langage
    Réponses: 1
    Dernier message: 07/09/2006, 23h11
  4. Réponses: 5
    Dernier message: 26/04/2006, 16h36
  5. Réponses: 6
    Dernier message: 19/10/2004, 13h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo