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

EDI, CMS, Outils, Scripts et API PHP Discussion :

compréhension fonction drupal [Drupal]


Sujet :

EDI, CMS, Outils, Scripts et API PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2004
    Messages
    450
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 450
    Par défaut compréhension fonction drupal
    Je me suis dans Drupal, je suis tombé dans une fonction php , et il y a un bout de code que je n'arrive pas à comprendre
    Je sais que le but est d'extraire x caractères a partir d'un position, mais il des choses que je n'arrive pas a comprende

    Que signifie UNICODE_MULTIBYTE pour drupal ?

    Que font ces lignes de codes :
    <<<
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      $c = ord($text[$bytes]);
            if ($c < 0x80 || $c >= 0xC0) {
              $chars++;
            }
    >>>
    fct ord() retournerait le caractère ascii d'un caractère
    0x80 et 0xC0 , je pense que sont des caractères hexadecimal, mais à quoi correspondent'ils ?
    Pourquoi fait'on un "si caractère ascii < caractère decimal " ( $c < 0x80 ) ???

    Je suis complètement à la ramasse la dessus

    La fonction complète au cas ou :
    <<<
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    function drupal_substr($text, $start, $length = NULL) {
      global $multibyte;
      if ($multibyte == UNICODE_MULTIBYTE) {
        return $length === NULL ? mb_substr($text, $start) : mb_substr($text, $start, $length);
      }
      else {
        $strlen = strlen($text);
        // Find the starting byte offset
        $bytes = 0;
        if ($start > 0) {
          // Count all the continuation bytes from the start until we have found
          // $start characters
          $bytes = -1; $chars = -1;
          while ($bytes < $strlen && $chars < $start) {
            $bytes++;
            $c = ord($text[$bytes]);
            if ($c < 0x80 || $c >= 0xC0) {
              $chars++;
            }
          }
        }
        else if ($start < 0) {
          // Count all the continuation bytes from the end until we have found
          // abs($start) characters
          $start = abs($start);
          $bytes = $strlen; $chars = 0;
          while ($bytes > 0 && $chars < $start) {
            $bytes--;
            $c = ord($text[$bytes]);
            if ($c < 0x80 || $c >= 0xC0) {
              $chars++;
            }
          }
        }
        $istart = $bytes;
     
        // Find the ending byte offset
        if ($length === NULL) {
          $bytes = $strlen - 1;
        }
        else if ($length > 0) {
          // Count all the continuation bytes from the starting index until we have
          // found $length + 1 characters. Then backtrack one byte.
          $bytes = $istart; $chars = 0;
          while ($bytes < $strlen && $chars < $length) {
            $bytes++;
            $c = ord($text[$bytes]);
            if ($c < 0x80 || $c >= 0xC0) {
              $chars++;
            }
          }
          $bytes--;
        }
        else if ($length < 0) {
          // Count all the continuation bytes from the end until we have found
          // abs($length) characters
          $length = abs($length);
          $bytes = $strlen - 1; $chars = 0;
          while ($bytes >= 0 && $chars < $length) {
            $c = ord($text[$bytes]);
            if ($c < 0x80 || $c >= 0xC0) {
              $chars++;
            }
            $bytes--;
          }
        }
        $iend = $bytes;
     
        return substr($text, $istart, max(0, $iend - $istart + 1));
      }
    }
    >>>

    Merci beaucoup pour votre aide

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    par que l’Unicode est en dehors de l’ASCII

    http://fr.wikipedia.org/wiki/ASCII
    http://fr.wikipedia.org/wiki/UTF-8

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Citation Envoyé par omelhor Voir le message
    Que signifie UNICODE_MULTIBYTE pour drupal ?
    A priori, elle sert à s'appuyer directement sur les fonctions de l'extension mbstring.

    Citation Envoyé par omelhor Voir le message
    Pourquoi fait'on un "si caractère ascii < caractère decimal " ( $c < 0x80 ) ???
    Parce que l'UTF-8 code un point de code sur 1 à 4 octets/unités de code et que, pour PHP, la notion d'encodage lui est totalement inconnu : on traite des octets au final (à l'exception des extensions qui gèrent, au moins en partie, l'UTF-8 - intl, mbstring, iconv).

    Citation Envoyé par omelhor Voir le message
    fct ord() retournerait le caractère ascii d'un caractère
    0x80 et 0xC0 , je pense que sont des caractères hexadecimal, mais à quoi correspondent'ils ?
    C'est par rapport à la manière dont sont encodés les points de code en UTF-8. La première unité de code d'un point est forcément < 0x80 ou >= 0xC2. Les autres, étant dans l'intervalle [0x80,0xBF] (aux exceptions près de la deuxième unité qui peut avoir des valeurs minimales supérieures ou maximales inférieures).

    En clair, pour compter le nombre de points de code, il suffit de compter le nombre de premières unités (celles < 0x80 ou >= 0xC2) (en supposant la chaîne valide).

    Encore qu'elle est +/- approximative. Pour en apprendre plus, l'article sur Wikipedia est plutôt complet.

    PS : un caractère, visuellement parlant, n'est pas nécessairement composé d'un seul point de code (il n'y a que intl/grapheme_* qui le gère correctement)

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

Discussions similaires

  1. Compréhension fonction .data( )
    Par Histo dans le forum jQuery
    Réponses: 2
    Dernier message: 09/10/2019, 11h36
  2. [Toutes versions] Compréhension fonction Left et protection
    Par bboy-eazy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/02/2014, 09h52
  3. Compréhension fonction optimset
    Par Rhius dans le forum MATLAB
    Réponses: 6
    Dernier message: 19/07/2013, 10h14
  4. Compréhension fonction transformée de Fourier
    Par NulleenMatlab dans le forum Signal
    Réponses: 6
    Dernier message: 08/05/2008, 11h59
  5. Problème compréhension fonction Prolog
    Par jpsegret dans le forum Prolog
    Réponses: 10
    Dernier message: 03/11/2007, 18h21

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