BOM et no BOM

tabliertablier Membre
18:24 modifié dans API AppKit #1
je voudrais encoder un string en "utf-8  BOM".
J'ai donc quelque chose comme:
- (BOOL)ecritUtf8:(NSString *)chemin letexte:(NSString *)letexte<br />{<br />NSData		*mesdata ;<br /><br />	mesdata = [letexte dataUsingEncoding:NSUTF8StringEncoding] ;	<br />	return [gestion createFileAtPath:chemin contents:mesdata attributes:nil] ;<br />}<br />


Le texte est bien codé en utf-8, mais le BOM est absent! Or, pour passer sur des PPC et des Intels, l'information BOM me parait indispensable.

J'ai été lire dans la doc et dans les .h, ce qui concerne l'encodage et les CFString. Je ne trouve rien! (je pense que je m'y prend mal dans ma recherche).  :-\\

Comment fait-on pour encodé en "utf-8 with BOM" ?

Réponses

  • schlumschlum Membre
    18:24 modifié #2
    dans 1201019223:
    e texte est bien codé en utf-8, mais le BOM est absent! Or, pour passer sur des PPC et des Intels, l'information BOM me parait indispensable.


    Absolument pas... Avec l'UTF-8, le BOM ne sert qu'à  dire que c'est de l'UTF-8 ; il n'y a pas de notion d'ordre des octets, c'est byte par byte.
    D'ailleurs le BOM est déconseillé avec l'UTF-8, car ça peut casser des scripts (PHP particulièrement qui envoient des headers).
  • tabliertablier Membre
    18:24 modifié #3
    Donc je ne m'en inquiète plus!
    Néanmoins cela m'a paru curieux car certains caractères s'écrivent sur deux, voir trois bytes consécutifs.

    Je viens de relire le chapitre sur "IntelBasedMacs" et effectivement il ne parle pas de swapper des bytes en utf-8.
    Merci pour l'info
  • AliGatorAliGator Membre, Modérateur
    18:24 modifié #4
    En effet l'UTF-8 est une transformation unicode à  codage de longueur variable, mais toujours octet par octet. Il n'y a donc pas de notion d'endianness, les octets sont toujours dans le même ordre.
    - Le BOM est toléré pour les fichiers UTF-8, mais ne sert comme l'a dit psychoh13 que de "signature" optionnelle (pour dire "tiens c'est de l'UTF-8 pas du texte pur ASCII") et déconseillée.
    - Le BOM est par contre déjà  plus utile voire indispensable pour les fichiers UTF-16, puisque cette transformation unicode est basée sur des mots de 16 bits (un ou deux mots par caractère) et non des octets. Les mots de 16 bits peuvent donc être en BigEndian ou LittleEndian (UTF-16BE ou UTF-16LE).
    L'endianness n'a alors d'effet que sur chacun des mots de 16 bits, mais pas sur l'ordre de ces mots pour former un caractère (si un caractère est représenté sur 2 mots de 16 bits en UTF-16 -- ce qui est rare car il faut déjà  qu'il ne soit pas dans le BMP, plan le plus utilisé -- les 2 mots seront toujours dans le même ordre l'un par rapport à  l'autre que ce soit LE ou BE, mais la représentation de chaque mot de 16 bits se fera selon l'endianness)
  • tabliertablier Membre
    18:24 modifié #5
    J'ai une question subsidiaire:
    comment fait-on pour différencier le codage "utf-8" du codage "Western Europe (apple Macintosh)" ?
  • Philippe49Philippe49 Membre
    janvier 2008 modifié #6
    dans 1201024102:

    En effet l'UTF-8 est une transformation unicode à  codage de longueur variable, mais toujours octet par octet. Il n'y a donc pas de notion d'endianness, les octets sont toujours dans le même ordre.
    - Le BOM est toléré pour les fichiers UTF-8, mais ne sert comme l'a dit psychoh13 que de "signature" optionnelle (pour dire "tiens c'est de l'UTF-8 pas du texte pur ASCII") et déconseillée.
    - Le BOM est par contre déjà  plus utile voire indispensable pour les fichiers UTF-16, puisque cette transformation unicode est basée sur des mots de 16 bits (un ou deux mots par caractère) et non des octets. Les mots de 16 bits peuvent donc être en BigEndian ou LittleEndian (UTF-16BE ou UTF-16LE).
    L'endianness n'a alors d'effet que sur chacun des mots de 16 bits, mais pas sur l'ordre de ces mots pour former un caractère (si un caractère est représenté sur 2 mots de 16 bits en UTF-16 -- ce qui est rare car il faut déjà  qu'il ne soit pas dans le BMP, plan le plus utilisé -- les 2 mots seront toujours dans le même ordre l'un par rapport à  l'autre que ce soit LE ou BE, mais la représentation de chaque mot de 16 bits se fera selon l'endianness)


    Je comprends mal. Pour moi, Big Endian ou Little Endian c'est une question d'ordre des octets, pas des bits.
    Donc, quand j'essaie :

    #include <stdio.h>
    #include <string.h>
    int main(void){
    char str[]="Moli\u00E8re\u4E24";
    printf("La longueur de la chaà®ne %s est : %d\nElle occupe %d octets\n",str,strlen(str),sizeof(str));
    unsigned char * ptr=str;
    for(;ptr[0];ptr++)
    printf("%x ",ptr[0]);
    putchar('\n');
    return 0;
    }


    cela me donne le résultat ci-dessous :

    La longueur de la chaà®ne Molière两 est : 11
    Elle occupe 12 octets
    4d 6f 6c 69 c3 a8 72 65 e4 b8 a4


    Qu'entends-tu par "les octets sont toujours dans le même ordre " en ce qui concerne les deux octets de  ' è ' ?

    Merci de vos éclaircissements

  • schlumschlum Membre
    18:24 modifié #7
    ça veut dire que "è" ça sera toujours "c3 a8" et jamais "a8 c3"

    Alors qu'en UTF-16, ça dépendra du type de processeur.
  • Philippe49Philippe49 Membre
    janvier 2008 modifié #8
    Donc, le codage par octets en UTF-8 suit l'endianness courant, alors qu'en UTF-16, on peut se retrouver avec des paires d'octets  qui suivent un endianness inverse de l'endianness "environnant".

    .. et des octets inversés par rapport à  l'ordre inverse des octets environnants vont se retrouver dans l'ordre "direct"  :adios!: :p :p <3 <3 :o :o ;D ;D ;D ;D ;D<br />Réciproquement, ...

    charmant !







  • Philippe49Philippe49 Membre
    18:24 modifié #9
    Tablier, il faut renommer ton topic ::

    to bom or not to bom, that is an endian question
  • schlumschlum Membre
    18:24 modifié #10
    dans 1201035692:

    Donc, le codage par octets en UTF-8 suit l'endianness courant, alors qu'en UTF-16, on peut se retrouver avec des paires d'octets  qui suivent un endianness inverse de l'endianness "environnant".


    Non, on ne peut pas parler d'endianness pour l'UTF-8 ; c'est octet par octet.
    On lit un octet, et ce même octet détermine de combien d'octets il doit être suivi pour le caractère complet.
    C'est l'ordre du flux, c'est tout, il n'y a pas d'indiens dans le coup  <3 <br />
    Pour l'UTF-16, c'est normal, ça fonctionne par 16 bits, et chaque couple d'octets représente un nombre, donc il y a forcément une notion d'endianness.
  • Philippe49Philippe49 Membre
    18:24 modifié #11
    Oui c'est ce que j'avais compris. Merci d'avoir pris le temps pour ces explications.
Connectez-vous ou Inscrivez-vous pour répondre.