• # Meilleur traduction vers l'utf8

    Posté par . En réponse au journal Jouons avec Unicode: Tchars, un Dchars pour Troff. Évalué à 5.

    On peut faire un peut mieux que répéter les shift & masques dans ta fonction hexatochars() :

    unsigned int bits = hexa;
    if (hexa >= (1<<26)) {
     a |= 1<<2;
     f = (bits & 0x3f) | 0x80;
     bits >>= 6;
    }
    if (hexa >= (1<<21)) {
     a |= 1<<3;
     e = (bits & 0x3f) | 0x80;
     bits >>= 6;
    }
    if (hexa >= (1<<16)) {
     a |= 1<<4;
     d = (bits & 0x3f) | 0x80;
     bits >>= 6;
    }
    if (hexa >= (1<<11)) {
     a |= 1<<5;
     c = (bits & 0x3f) | 0x80;
     bits >>= 6;
    }
    if (hexa >= (1<<7)) {
     a |= (1<<6) | (1<<7);
     b = (bits & 0x3f) | 0x80;
     bits >>= 6;
    }
    a |= bits;
    

    J'ai écrit les constantes différemment car je trouve que ça permet de mieux se rendre compte que les intervalles proposés par ce standard encodent 7, 4, 5, 5, 5 et 5 bits chacun, pour un total 31 bits pour un "code point". En plus, avec le fait qu'on shift toujours de 6 bits, ça m'avait embrouillé sur le calcul, mais en fait ça marche exactement comme ça car chaque octet qui s'ajoute vient rétrécir d'un bit la place qu'on a dans le premier (sauf au premier ajout, où on perd 2 bits car on ne peut pas prendre le préfixe « réservé » 0b10xxxxxx)