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

Web & réseau Delphi Discussion :

Comment connaître l'encodage d'un stream provenant d'un FTP ?


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut Comment connaître l'encodage d'un stream provenant d'un FTP ?
    Bonjour à tous,

    Je galère depuis un moment sur un sujet qui doit être tout bête, même après avoir lu pas mal de chose sur le sujet.
    Je charge un flux sur un ftp avec Indy, tel qu'il m'a été conseillé précédemment pour le multiplateforme.
    Je charge ensuite ce flux dans un stringlist pour le traiter, ce qui ne me pose pas de problème.
    J'ai même trouvé comment transformer un string UTF8 en ANSI.
    Le problème c'est que je ne sais pas à l'avance si le fichier qui est sur le ftp est en ANSI ou en UTF8 (en tout cas pas d'unicode ... c'est déjà ça)
    Donc si c'est un flux en UTF8 et que je le convertis en ANSI tout va bien, mais si c'est un flux en ANSI et que je le convertis en ANSI à nouveau ça va pas !

    La seule information qui me manque c'est comment savoir si le TStringStream que je charge depuis le ftp est en UTF8 ou en ANSI ?
    Je n'ai pas trouvé la fonction magique qui me donnerait cette information me permettant de discriminer le traitement à effectuer.
    J'ai cherché dans le TEncoding du TStringStream, mais je n'ai rien trouvé de différent que je charge un fichier UTF8 ou un fichier ANSI ... j'ai dû mal chercher, ou alors ça se trouve ailleurs ?

    Merci d'avance et bien cordialement.

  2. #2
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Le seul truc qui distingue des fichiers ANSI/UTF-8 est la présence du BOM comme premier caractère ou son absence.

    si ce caractère est à, c'est de l'UTF-8.
    S'il n'y est pas, il faut vérifier s'il y a des trucs chelous dans le fichier avant de considérer que c'est de l'ANSI car certains fichiers UTF-8 sont enregistrés sans BOM.

    Pas de fonction miracle pour ça malheureusement.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut
    Merci pour cette réponse qui confirme mes craintes.
    Visiblement les fichiers en UTF8 que je dois traiter n'ont pas de BOM en début de fichier, pas de signature ...
    Ce qui me rassure c'est que j'ai compris, mais que les fichiers à traiter n'ont pas le discriminant désiré ... je ne sais pas comment font les logiciels pour comme notepad pour détecter que c'est de l'utf8 et pas de l'ANSI ?
    En fait, sur la vue en hexa, ce sont essentiellement les caractères accentués qui sont codés sur deux octets en UTF8 et 1 octet en ANSI.

    Je vais essayer de travailler là-dessus, mais je ne connais pas à l'avance le contenu du fichier ... :o(
    Il va falloir développer de l'intelligence artificielle ?

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    D'après ce que j'ai lu, si c'est soit ANSI, soit UTF-8, c'est ANSI si tu trouves un caractère invalide en UTF-8...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut
    Oui merci c'est ce que je suis en train de faire.
    J'ai remarqué que tout les caractères accentués étaient codés sur 2 octets qui commencent par C3
    Je vais me baser là-dessus je crois...
    je vous tiens au courant ...

    EDIT : Bon ça marche très bien en détectant $C3 dans les fichiers UTF8, et s'il n'y en a pas ça veut dire qu'il n'y a pas de caractères accentués et dans ce cas là UTF8 = ANSI
    Donc pour l'instant je vais en rester là

    Merci à vous

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 770
    Par défaut
    Citation Envoyé par navyg Voir le message
    J'ai remarqué que tout les caractères accentués étaient codés sur 2 octets qui commencent par C3
    je pense que la meilleure approche est :

    Premièrement, il faut tester si ton caractère est supérieur strictement à 127 (0x7F).
    La table ASCII n'utilise que 127 caractères (7 bits sur 1 octet) et l'UTF-8 utilise cette caractéristique pour être compatible ASCII.

    Deuxièmement, si tu trouves 1 caractère non ASCII, tester si c'est 1 caractère UTF-8 valide (regarde la page wikipedia postée par @tourlourou)
    Là c'est 1 gros problème de l'UTF-8 notamment pour les bases de données : ce n'est pas 1 encodage fixe.
    Il faut :
    1. prendre 1 octet, tester s'il commence par 0x6 (sur 3 bits), 0xE (sur 4 bits) ou 0x1E (sur 5 bits et le 6ième bit soit 1 soit 0)
    2. extraire le codepoint avec les octets suivants - tester leur validité, commence par 0x2 sur 2 bits
    3. valider le codepoint avec la plage des valeurs


    peut-être qu'1 bibliothèque peut le faire pour toi.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut
    Citation Envoyé par pprem Voir le message
    Le seul truc qui distingue des fichiers ANSI/UTF-8 est la présence du BOM comme premier caractère ou son absence.

    si ce caractère est à, c'est de l'UTF-8.
    S'il n'y est pas, il faut vérifier s'il y a des trucs chelous dans le fichier avant de considérer que c'est de l'ANSI car certains fichiers UTF-8 sont enregistrés sans BOM.

    Pas de fonction miracle pour ça malheureusement.
    au fait tu voulais indiquer quelque chose après si ce caractère est à ?

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 18/11/2010, 14h51
  2. Comment connaître l'encodage d'un fichier texte?
    Par sergentgarcia dans le forum Général Python
    Réponses: 3
    Dernier message: 26/05/2008, 10h41
  3. Réponses: 5
    Dernier message: 15/04/2004, 13h24
  4. Comment connaître son IP derrière un routeur ?
    Par momox dans le forum C++Builder
    Réponses: 2
    Dernier message: 22/02/2004, 18h24
  5. Comment connaître le nom de l'ordinateur ?
    Par M.Dlb dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 30/08/2003, 23h03

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