Longeur des chaines de caractères: Ô surprise (Créer un compte)

  • Statut : non résolu
15 sujets de 1 à 15 (sur un total de 23)
  • Auteur
    Messages
  • #557356
    Hanami
    Participant
    Chevalier WordPress
    173 contributions

    Bonsoir,

    Je viens de me rendre compte du fait que si l’on transfome une chaine de caractères comportant des caractères accentués ainsi que d’ autres caractères dont les codes sont supérieurs à 124 on s’apercoit que la valeur renvoyée par la fonction STRLEN n’est pas celle du nombre de caractères affichés mais celle du nombre d’octets qui codent la chaine.:rolleyes:

    Par exemple la chaine
    < abcde12345éèêëàâôöîïûùç test avec 33333 Cigale 3, épisode où va t on? >
    est évaluée par STRLEN à 84 .

    Par contre aprés tranformation en
    < abcde12345eeeeaaooiiuuctestavec33333Cigale3episodeouvaton >
    STRLEN l’évalue à 57 caractères donc une différence de 27 qui dans le cas de cette taille correspond aux espaces, à la virgule, au point d’interrogation et au double codage des caractères diacritiques.

    STRLEN n’évalue donc pas des caractères mais des octets :idea:, ce qui est logique puisque les caractères de code supérieur à 124 sont codés comme <194>.

    Intéressant et bon à savoir si l’on fait des comparaison sur des chaines "avec" ou "sans" caractères diacritiques.
    Même remarque si l'on veut enlever les caractères non alpha-numérique.

    Voici le code utilisé pour la conversion:

    <?php
    $eol='<br/>';
    $eob='<hr>';

    function printable($c) {
    if( (($c>47) AND ($c<57)) OR
    (($c>64) AND ($c<91)) OR
    (($c>96) AND ($c<123)) ) RETURN TRUE;
    else RETURN FALSE;
    }


    function convert ($code_char) { // ne traite pas les majuscules accentuées mais pourrait
    $char='';
    switch ($code_char) {
    case 194: $char=''; break; // pré-codage des diacritiques
    case 195: $char=''; break; // pré-codage des diacritiques
    case 051: $char='3';break; // le 51 a parfois un comportement étrange.
    case 160: $char='a';break;
    case 161: $char='a';break;
    case 162: $char='a';break;
    case 163: $char='a';break;
    case 164: $char='a';break;
    case 165: $char='a';break;
    case 166: $char='a';break;
    case 167: $char='c';break;
    case 168: $char='e';break;
    case 169: $char='e';break;
    case 170: $char='e';break;
    case 171: $char='e';break;
    case 172: $char='e';break;
    case 173: $char='i';break;
    case 174: $char='i';break;
    case 175: $char='i';break;
    case 176: $char='i';break;
    case 176: $char='a';break;
    case 177: $char='o';break;
    case 178: $char='n';break;
    case 179: $char='o';break;
    case 180: $char='o';break;
    case 181: $char='o';break;
    case 182: $char='o';break;
    case 183: $char='o';break;
    case 184: $char='o';break;
    case 185: $char='u';break;
    case 186: $char='u';break;
    case 187: $char='u';break;
    case 188: $char='u';break;
    case 189: $char='u';break;
    case 190: $char='y';break;
    default : $char='' ;break;
    } // end de switch
    RETURN $char;
    } // end function


    function remove_fancy_char_from($chaine) {
    $eol='<br/>';
    $i=0;
    $out='';
    $char='';
    $one_char='';
    $code=0;
    for ($i=0; $i <= strlen($chaine); $i++ ) {
    $one_char=substr($chaine,$i,1);
    $code=ord($one_char);
    if (printable( $code ) ) { $char=$one_char ;}
    else { $char=convert($code); }
    $out=$out.$char;
    } // end de for
    return $out;
    } // end function


    echo 'START'.'<br/>';
    $chaine1='abcde12345éèêëàâôöîïûùç test avec 33333 Cigale 3, épisode où va t on?';
    $chaine2= remove_fancy_char_from($chaine1);
    echo 'CONTROLE'.$eol;
    echo 'CHAINE 1 : '. $chaine1.' '.strlen($chaine1).' caractères)'.'<br/>';
    echo 'CHAINE 2 : '. $chaine2.' '.strlen($chaine2).' caractères)'.'<br/>';
    echo $eob;


    ?>

    #1032056
    C_Lucien
    Modérateur
    Maître WordPress
    5115 contributions

    Bonjour,

    as-tu essayé avec iconv_strlen ?

    iconv_strlen — Retourne le nombre de caractères d’une chaîne
    À l’opposée de strlen(), la valeur de retour de iconv_strlen() est le nombre de caractères faisant partie de la séquence d’octets str, ce qui n’est pas toujours la même chose que la taille en octets de la chaîne de caractères.

    Je fais le gars qui s’y connait, mais non, je sais juste chercher les infos dont j’ai besoin…
    http://php.net/manual/fr/function.iconv-strlen.php

    #1032057
    PhiLyon
    Modérateur
    Maître WordPress
    28260 contributions

    Bonsoir.

    Si quelqu’un pouvait m’expliquer à quoi ça sert 😉

    🙂

    #1032058
    Hanami
    Participant
    Chevalier WordPress
    173 contributions

    Bonsoir,

    Non je n’ai pas essayé iconv_strlen. Je ne savais même pas que cela existait car je ne l’ai pas sur la liste de base des fonctions de gestion de chaines de caractères de php.
    C’est un découverte par hasard en voulant vérifier comment limiter le nombre de caractères sur le quel rechercher l’identité entre 2 chaines lorsque l’on veut comparer, par exemple, un titre avec un permalien ou la valeur de « guid ».
    Marc.

    #1032059
    ouistiti.net
    Participant
    Maître WordPress
    1879 contributions
    #1032060
    PhiLyon
    Modérateur
    Maître WordPress
    28260 contributions

    Ouais 😕

    Je ne me rappelle pas avoir utiliser sciemment tout ça.

    De toutes façons je n’aime pas les  » chaînes  » 😉

    🙂

    #1032061
    Hanami
    Participant
    Chevalier WordPress
    173 contributions

    Je n’aime pas les chaînes non plus.

    A quoi sert d’enlever les caractères diacritiques et autres caractères non alpha-numériques ???
    Excellente question.

    Normalement à pas grand chose sauf si, comme dans mon cas, on veut comparer un titre d’article dans WP avec son url dans Blogger par exemple, ceci à fin de modifier des liens internes (entre articles) après migration de Blogger vers WP, et ce, de façon automatique.

    Un exemple:

    url Blogger: http://hanami.blogspot.fr/2014/10/ovni-52-evolution-sister-ship-update.html
    Titre : OVNI 52 Evolution Sister-Ship Update

    Cette url se trouve dans la redirection suivante:

    A la suite de la migration se trouve à présent dans l’article dans WP et il faut la changer en un permalink WP pour ne pas se retrouver dans Blogger lorsque l’on clique sur le lien.

    Il faut donc la remplacer par le permalink WP.

    Le processus est donc:
    1 – Pour tous les articles qui ont au moins une redirection comprenant « <a href="
    http://marc-hanami.blogspot.fr/&quot; sélectionner le texte et se positionner sur le redirection.
    2 – Chercher l’article dont le titre correspond à le fin de l’url de redirection
    3 – Sélectionner cet article et son guid
    4 – remplacer dans l’article dans WP l’url Blogger par le Guid
    5 – chercher d’autres redirections dans le même article
    6 – passer à l’article suivant.

    Or le titre et l’url sont différents comme vu plus haut.
    Donc il faut les rendre identiques en remplaçant les diacritiques par des alphanumériques basiques et supprimer tous les non alphanumériques.

    On obtient ainsi et on obtient bien dans les 2 cas: bingo.

    pour construire le titre à partir de l’url j’utilise une fonction php no_fancy_char()
    pour construire le titre à partir du select j’utilise 2 fonctions stockées dans la base de donnée WP: NoAccent et AsciiOnly.

    SELECT id, post_title, guid FROM wp_post WHERE NoAccent(AsciiOnly(post_title))=no_fancy_char(url_title).
    Je fais un ajustement pour la longueur de url_title qui est souvent plus courte que le titre réel de l’article.

    Je ne sais pas si cela répond à la question mais j’aurai essayé.

    Marc.

    #1032062
    PhiLyon
    Modérateur
    Maître WordPress
    28260 contributions

    Normalement à pas grand chose sauf si, comme dans mon cas, on veut comparer un titre d’article dans WP avec son url dans Blogger par exemple, ceci à fin de modifier des liens internes (entre articles) après migration de Blogger vers WP, et ce, de façon automatique.

    On m’aurait dit ça dès le début, je ne serais pas venu polluer la conversation. 😇

    Mais c’est quand même spécifique et trop pointu pour moi comme utilisation.

    Merci de m’avoir consacrer un peu de temps 👏

    🙂

    #1032063
    Hanami
    Participant
    Chevalier WordPress
    173 contributions

    Ca ne pollue pas, cela aide aussi à se demander pourquoi on le fait et si il n’y a pas une solution plus simple.
    J’ai découvert WP en Septembre, j’ai commencé à m’en servir en octobre et j’ai plein de choses à apprendre.
    Pour moi tous les commentaires sont utiles.
    Et si jamais tu migres (ou aide à migrer) un Blog depuis Blogger, ça peut servir … les fonctions stockées de conversion sont aussi sur le forum.

    Merci.
    Marc.

    #1032064
    ouistiti.net
    Participant
    Maître WordPress
    1879 contributions

    D’après ce tuto : http://www.wpbeginner.com/wp-tutorials/how-to-switch-from-blogger-to-wordpress-without-losing-google-rankings/ il me semble qu’il y a plus simple.

    1. Une modification dans le thème de blogger (page html)
    2. Ajouter le code proposé dans le fichier functions.php.

    À tester en local

    #1032065
    Lumiere de Lune
    Participant
    Maître WordPress
    20531 contributions

    Je déplace le sujet.

    Ce forum est réservé au dépôts de trucs et astuces pour WordPress. Là on est dans l’application de la technique pure et simple de php, correspondant au manuel.

    Quant à l’import de Blogger, il stocke les anciennes urls dans la base de données… quand il est fait correctement

    #1032066
    Hanami
    Participant
    Chevalier WordPress
    173 contributions
    Lumière de Lune wrote:
    Quant à l’import de Blogger, il stocke les anciennes urls dans la base de données… quand il est fait correctement

    Interressant cela.
    Où est ce documenté …?
    Ce truc est une mine d’information mais comme dans toutes les mines, les filons sont difficiles à trouver?

    Comme l’import est automatique les urls devraient être présentes mais dans CE CAS il s’agit d’urls incluses dans le texte de l’article: ce sont des liens cliquables, comme pour renvoyer sur un site web externe.
    Est ce que, lors d’un import, WP scanne tous les textes pour stocker quelque part tous les liens externes ???

    Par exemple, dans le texte suivant en bleu , est ce que WP stocke dans une table à part les urls de liens en rouge?

    On February 21, I made a post on HANAMI II’s blog under the title  » Darwin and his theory of evolution at … Alubat . « 
    OVNI Evolution is the mane of their new boat.
    Well, this ‘Evolution’ had a positive result. Very positive I will dare saying …
    2014 10 03: <a href="http://marc-hanami.blogspot.fr/2014/10/ovni-52-evolution-sister-ship-update.html« >CLICK HERE TO SEE THE OVNI EVOLUTION number 2 launched in September 2014.


    Now let’s see why I say so.

    We are Thursday the 25th of April in Les Sables d’Olonne (France), the weather is gorgeous after a dull winter whith weeks and weeks of rain and cold and I have been invited by <a href="http://www.alubat.com/ »>ALUBAT to go out and test their new<a href="http://www.alubat.com/les-gammes/gamme-ovni-evolution/ovni-52-evolution/ »> ALUBAT 52, some time called OVNI Evolution.

    So this morning at 09:00 I left my trusted HANAMI II OVNI 445 and after a short drive to the marina I walked down the pontoon where Lagoons wait for skippers to deliver them to charter companies. At the very end of it I find her : a white lady.

    Merci

    #1032067
    Hanami
    Participant
    Chevalier WordPress
    173 contributions

    Désolé, le codage couleur n’a pas marché mais les urls des liens sont soulignées.
    Est ce que ces urls sont stockées à part (hors du texte) dans une table?
    Si oui cela facilite leur accès mais ne change rien à la difficulté de les changer pour la 1ere et la 3eme au moins.

    Marc

    #1032068
    ouistiti.net
    Participant
    Maître WordPress
    1879 contributions

    Re-bonjour,

    Les liens qui se trouvent dans le texte et qui pointent vers un site extérieur sont normalement conservés, sauf si l’url a été modifiée par le propriétaire du/des site (s).

    Ensuite, il suffit de changer l’url dans la base de données, manuellement ou avec des requêtes SQL. De nombreux tutoriels sont mis à disposition via le web.

    En ce qui concerne le SEO, il faudra exécuter des redirections dans le fichier .htacess

    Comme il a été mentionné : si l’importation a été faite dans les règles de l’art, tout devrait fonctionner. Autrement, il y a un plugin qui facilite l’import.

    https://fr.wordpress.org/plugins/blogger-importer/ ou http://www.trucsdeblogueuse.com/comment-exporter-son-blog-vers-wordpress-org/

    #1032069
    Hanami
    Participant
    Chevalier WordPress
    173 contributions

    Merci « Ouistiti.net ».
    C’est bien ce que j’avais compris.
    Donc si je dois faire le type de changement suivant pour des liens « entre article », je les fait manuellement.

    url originale blogger = marc hanami.blogspot.fr/2013/06/cigale 18 episode 3.html
    url nouvelle wordpress = 127.0.0.1/wordpress/?p=442

    Comme j’en ai entre 150 et 200 sur 900 articles je veux le faire avec un automate.
    Merci encore.

    Marc.

15 sujets de 1 à 15 (sur un total de 23)
  • Vous devez être connecté pour répondre à ce sujet.