Ce qui est marrant, c'est que le fameux BOM utf-8 peut ne pas passer
ce test ! ;-)
Ce qui est marrant, c'est que le fameux BOM utf-8 peut ne pas passer
ce test ! ;-)
Ce qui est marrant, c'est que le fameux BOM utf-8 peut ne pas passer
ce test ! ;-)
dans (in) fr.comp.infosystemes.www.auteurs, Olivier Miakinen
<om+ ecrivait (wrote) :
> Je te mets au défi de me trouver un seul texte ayant un sens dansn'importe laquelle des langues du monde, encodé dans n'importe quel
charset autre qu'UTF-8, et dans lequel tous les caractères non-ASCII
s'enchaînent de telle sorte que l'on puisse croire à de l'UTF-8 :
[...]
Merci de ne pas prendre prétexte de problèmes avec UTF-16 pour justifier
un usage dans UTF-8. Le BOM *est* utile dans UTF-16, il ne l'est *pas*
dans UTF-8.
Je ne suis pas aussi pointu que toi concernant les jeux d'encodage, mais
après m'être renseigné un peu suite à ma mésaventure, j'en arrive à la
même conclusion.
dans (in) fr.comp.infosystemes.www.auteurs, Olivier Miakinen
<om+news@miakinen.net> ecrivait (wrote) :
> Je te mets au défi de me trouver un seul texte ayant un sens dans
n'importe laquelle des langues du monde, encodé dans n'importe quel
charset autre qu'UTF-8, et dans lequel tous les caractères non-ASCII
s'enchaînent de telle sorte que l'on puisse croire à de l'UTF-8 :
[...]
Merci de ne pas prendre prétexte de problèmes avec UTF-16 pour justifier
un usage dans UTF-8. Le BOM *est* utile dans UTF-16, il ne l'est *pas*
dans UTF-8.
Je ne suis pas aussi pointu que toi concernant les jeux d'encodage, mais
après m'être renseigné un peu suite à ma mésaventure, j'en arrive à la
même conclusion.
dans (in) fr.comp.infosystemes.www.auteurs, Olivier Miakinen
<om+ ecrivait (wrote) :
> Je te mets au défi de me trouver un seul texte ayant un sens dansn'importe laquelle des langues du monde, encodé dans n'importe quel
charset autre qu'UTF-8, et dans lequel tous les caractères non-ASCII
s'enchaînent de telle sorte que l'on puisse croire à de l'UTF-8 :
[...]
Merci de ne pas prendre prétexte de problèmes avec UTF-16 pour justifier
un usage dans UTF-8. Le BOM *est* utile dans UTF-16, il ne l'est *pas*
dans UTF-8.
Je ne suis pas aussi pointu que toi concernant les jeux d'encodage, mais
après m'être renseigné un peu suite à ma mésaventure, j'en arrive à la
même conclusion.
Le BOM, m'avait-il dit, ne correspondait à aucun caractère
dans aucun charset ISO 8 bits dérivé de us-ascii.
C'est exact. Il y a trop peu d'emplacements dans les charsets 8 bits
pour en dépenser un avec un « zero-width no-break space ». De toute
manière il ne pourrait en aucun cas servir de « byte order mark »
puisque renverser l'ordre d'un seul octet donne le même octet, au
contraire du BOM en UTF-16 et UTF-32, où le renversement des 2 ou 4
octets donne une valeur qui est garantie être à jamais invalide.
L'analyse du contenu d'un fichier dans un charset autre que l'UTF-8,
pour en déduire la langue et le charset, *est* un problème difficile.
Mais l'analyse d'un fichier dans un charset quelconque, simplement pour
en déduire si oui ou non c'est de l'UTF-8 (et ce, quelle que soit la
langue utilisée) est une question *triviale*. Un simple iconv de UTF-8
vers UTF-16, par exemple, te donne immédiatement la réponse.
index = 0
tant que index< longueur de la chaîne
{
si caractère(index) dans [0..x7f]
// ok
sinon, si caractère(index) dans [xc0..xdf]
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
sinon, si caractère(index) dans [xe0..xef]
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
sinon, si caractère(index) dans [xf0..xf7]
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
sinon
ERREUR
index = index + 1
si index> longueur de la chaine
ERREUR
}
Attention, je viens d'écrire ce test en lisant la doc, je ne garantis
pas sa validité absolue, et en outre il ne vérifie pas les séquences
invalides car trop longues. Malgré tout, un code de ce genre suffit pour
distinguer UTF-8 de tout le reste.
Le BOM, m'avait-il dit, ne correspondait à aucun caractère
dans aucun charset ISO 8 bits dérivé de us-ascii.
C'est exact. Il y a trop peu d'emplacements dans les charsets 8 bits
pour en dépenser un avec un « zero-width no-break space ». De toute
manière il ne pourrait en aucun cas servir de « byte order mark »
puisque renverser l'ordre d'un seul octet donne le même octet, au
contraire du BOM en UTF-16 et UTF-32, où le renversement des 2 ou 4
octets donne une valeur qui est garantie être à jamais invalide.
L'analyse du contenu d'un fichier dans un charset autre que l'UTF-8,
pour en déduire la langue et le charset, *est* un problème difficile.
Mais l'analyse d'un fichier dans un charset quelconque, simplement pour
en déduire si oui ou non c'est de l'UTF-8 (et ce, quelle que soit la
langue utilisée) est une question *triviale*. Un simple iconv de UTF-8
vers UTF-16, par exemple, te donne immédiatement la réponse.
index = 0
tant que index< longueur de la chaîne
{
si caractère(index) dans [0..x7f]
// ok
sinon, si caractère(index) dans [xc0..xdf]
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
sinon, si caractère(index) dans [xe0..xef]
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
sinon, si caractère(index) dans [xf0..xf7]
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
sinon
ERREUR
index = index + 1
si index> longueur de la chaine
ERREUR
}
Attention, je viens d'écrire ce test en lisant la doc, je ne garantis
pas sa validité absolue, et en outre il ne vérifie pas les séquences
invalides car trop longues. Malgré tout, un code de ce genre suffit pour
distinguer UTF-8 de tout le reste.
Le BOM, m'avait-il dit, ne correspondait à aucun caractère
dans aucun charset ISO 8 bits dérivé de us-ascii.
C'est exact. Il y a trop peu d'emplacements dans les charsets 8 bits
pour en dépenser un avec un « zero-width no-break space ». De toute
manière il ne pourrait en aucun cas servir de « byte order mark »
puisque renverser l'ordre d'un seul octet donne le même octet, au
contraire du BOM en UTF-16 et UTF-32, où le renversement des 2 ou 4
octets donne une valeur qui est garantie être à jamais invalide.
L'analyse du contenu d'un fichier dans un charset autre que l'UTF-8,
pour en déduire la langue et le charset, *est* un problème difficile.
Mais l'analyse d'un fichier dans un charset quelconque, simplement pour
en déduire si oui ou non c'est de l'UTF-8 (et ce, quelle que soit la
langue utilisée) est une question *triviale*. Un simple iconv de UTF-8
vers UTF-16, par exemple, te donne immédiatement la réponse.
index = 0
tant que index< longueur de la chaîne
{
si caractère(index) dans [0..x7f]
// ok
sinon, si caractère(index) dans [xc0..xdf]
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
sinon, si caractère(index) dans [xe0..xef]
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
sinon, si caractère(index) dans [xf0..xf7]
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
index = index+1
si caractère(index) pas dans [x80..xbf] ERREUR
sinon
ERREUR
index = index + 1
si index> longueur de la chaine
ERREUR
}
Attention, je viens d'écrire ce test en lisant la doc, je ne garantis
pas sa validité absolue, et en outre il ne vérifie pas les séquences
invalides car trop longues. Malgré tout, un code de ce genre suffit pour
distinguer UTF-8 de tout le reste.
Le BOM, m'avait-il dit, ne correspondait à aucun caractère
dans aucun charset ISO 8 bits dérivé de us-ascii.
C'est exact. Il y a trop peu d'emplacements dans les charsets 8 bits
pour en dépenser un avec un « zero-width no-break space ». De toute
manière il ne pourrait en aucun cas servir de « byte order mark »
puisque renverser l'ordre d'un seul octet donne le même octet, au
contraire du BOM en UTF-16 et UTF-32, où le renversement des 2 ou 4
octets donne une valeur qui est garantie être à jamais invalide.
Je ne suis pas sûr de t'avoir compris :
dans les charsets ISO 8 bits, ce
sont les zones de 0x80 à 0x9F qui sont réservées,
or les octets utilisés
dans les BOM pour UTF-32, UTF-16 ou UTF-8 sont tous hors de cette zone,
et correspondent donc bien à des caractères valides dans les charsets
ISO 8 bits.
Je pense que tu voulais dire que le caractère utilisé pour le BOM
(U+FEFF) n'était présent dans aucun des charsets ISO 8 bits ?
[...]L'analyse du contenu d'un fichier dans un charset autre que l'UTF-8,
pour en déduire la langue et le charset, *est* un problème difficile.
Mais l'analyse d'un fichier dans un charset quelconque, simplement pour
en déduire si oui ou non c'est de l'UTF-8 (et ce, quelle que soit la
langue utilisée) est une question *triviale*. Un simple iconv de UTF-8
vers UTF-16, par exemple, te donne immédiatement la réponse.
Si l'on n'a pas de l'UTF-8, je suppose que iConv va tomber sur des
séquences d'octets invalides et qu'il va le signaler ?
[...]
Attention, je viens d'écrire ce test en lisant la doc, je ne garantis
pas sa validité absolue, et en outre il ne vérifie pas les séquences
invalides car trop longues. Malgré tout, un code de ce genre suffit pour
distinguer UTF-8 de tout le reste.
Euh... je suis preneur des explications sur le pourquoi du comment - en
fait vu que tu as lu la doc, si tu as des pointeurs ça me ferait gagner
du temps, hum
Représentation binaire UTF-8 Signification
0xxxxxxx 1 octet codant 1 à 7 bits
110xxxxx 10xxxxxx 2 octets codant 8 à 11 bits
1110xxxx 10xxxxxx 10xxxxxx 3 octets codant 12 à 16 bits
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4 octets codant 17 à 21 bits
Le BOM, m'avait-il dit, ne correspondait à aucun caractère
dans aucun charset ISO 8 bits dérivé de us-ascii.
C'est exact. Il y a trop peu d'emplacements dans les charsets 8 bits
pour en dépenser un avec un « zero-width no-break space ». De toute
manière il ne pourrait en aucun cas servir de « byte order mark »
puisque renverser l'ordre d'un seul octet donne le même octet, au
contraire du BOM en UTF-16 et UTF-32, où le renversement des 2 ou 4
octets donne une valeur qui est garantie être à jamais invalide.
Je ne suis pas sûr de t'avoir compris :
dans les charsets ISO 8 bits, ce
sont les zones de 0x80 à 0x9F qui sont réservées,
or les octets utilisés
dans les BOM pour UTF-32, UTF-16 ou UTF-8 sont tous hors de cette zone,
et correspondent donc bien à des caractères valides dans les charsets
ISO 8 bits.
Je pense que tu voulais dire que le caractère utilisé pour le BOM
(U+FEFF) n'était présent dans aucun des charsets ISO 8 bits ?
[...]
L'analyse du contenu d'un fichier dans un charset autre que l'UTF-8,
pour en déduire la langue et le charset, *est* un problème difficile.
Mais l'analyse d'un fichier dans un charset quelconque, simplement pour
en déduire si oui ou non c'est de l'UTF-8 (et ce, quelle que soit la
langue utilisée) est une question *triviale*. Un simple iconv de UTF-8
vers UTF-16, par exemple, te donne immédiatement la réponse.
Si l'on n'a pas de l'UTF-8, je suppose que iConv va tomber sur des
séquences d'octets invalides et qu'il va le signaler ?
[...]
Attention, je viens d'écrire ce test en lisant la doc, je ne garantis
pas sa validité absolue, et en outre il ne vérifie pas les séquences
invalides car trop longues. Malgré tout, un code de ce genre suffit pour
distinguer UTF-8 de tout le reste.
Euh... je suis preneur des explications sur le pourquoi du comment - en
fait vu que tu as lu la doc, si tu as des pointeurs ça me ferait gagner
du temps, hum
Représentation binaire UTF-8 Signification
0xxxxxxx 1 octet codant 1 à 7 bits
110xxxxx 10xxxxxx 2 octets codant 8 à 11 bits
1110xxxx 10xxxxxx 10xxxxxx 3 octets codant 12 à 16 bits
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4 octets codant 17 à 21 bits
Le BOM, m'avait-il dit, ne correspondait à aucun caractère
dans aucun charset ISO 8 bits dérivé de us-ascii.
C'est exact. Il y a trop peu d'emplacements dans les charsets 8 bits
pour en dépenser un avec un « zero-width no-break space ». De toute
manière il ne pourrait en aucun cas servir de « byte order mark »
puisque renverser l'ordre d'un seul octet donne le même octet, au
contraire du BOM en UTF-16 et UTF-32, où le renversement des 2 ou 4
octets donne une valeur qui est garantie être à jamais invalide.
Je ne suis pas sûr de t'avoir compris :
dans les charsets ISO 8 bits, ce
sont les zones de 0x80 à 0x9F qui sont réservées,
or les octets utilisés
dans les BOM pour UTF-32, UTF-16 ou UTF-8 sont tous hors de cette zone,
et correspondent donc bien à des caractères valides dans les charsets
ISO 8 bits.
Je pense que tu voulais dire que le caractère utilisé pour le BOM
(U+FEFF) n'était présent dans aucun des charsets ISO 8 bits ?
[...]L'analyse du contenu d'un fichier dans un charset autre que l'UTF-8,
pour en déduire la langue et le charset, *est* un problème difficile.
Mais l'analyse d'un fichier dans un charset quelconque, simplement pour
en déduire si oui ou non c'est de l'UTF-8 (et ce, quelle que soit la
langue utilisée) est une question *triviale*. Un simple iconv de UTF-8
vers UTF-16, par exemple, te donne immédiatement la réponse.
Si l'on n'a pas de l'UTF-8, je suppose que iConv va tomber sur des
séquences d'octets invalides et qu'il va le signaler ?
[...]
Attention, je viens d'écrire ce test en lisant la doc, je ne garantis
pas sa validité absolue, et en outre il ne vérifie pas les séquences
invalides car trop longues. Malgré tout, un code de ce genre suffit pour
distinguer UTF-8 de tout le reste.
Euh... je suis preneur des explications sur le pourquoi du comment - en
fait vu que tu as lu la doc, si tu as des pointeurs ça me ferait gagner
du temps, hum
Représentation binaire UTF-8 Signification
0xxxxxxx 1 octet codant 1 à 7 bits
110xxxxx 10xxxxxx 2 octets codant 8 à 11 bits
1110xxxx 10xxxxxx 10xxxxxx 3 octets codant 12 à 16 bits
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4 octets codant 17 à 21 bits
Je ne suis pas sûr de t'avoir compris :
En effet. Pour comprendre ce que je voulais dire, il faut savoir ce
qu'est ce caractère Unicode bizarre qui s'est appelé d'abord ZWNBSP
avant de s'appeler BOM, pourquoi il peut servir de BOM dans UTF-16 et
pourquoi « ça marche », avant de se poser la question de l'existence
d'un BOM en UTF-8 ou dans les autres encodages dont la base est l'octet
et pas un mot de 2 ou 4 octets.
dans les charsets ISO 8 bits, ce
sont les zones de 0x80 à 0x9F qui sont réservées,
Si en écrivant « réservées » tu veux dire « dont toutes les positions
sont invalides », alors ceci vaut seulement pour ceux tels que "ISO
8859-1" (sans trait d'union). Dans "ISO-8859-1", toutes les positions
sont définies, dont des caractères de commande aux valeurs 00 à 1F, 7F,
et 80 à 9F. Et puis bien sûr il y a des charsets 8 bits tels que cp1252
ou cp850 qui définissent des caractères imprimables à ces positions.
Euh... je suis preneur des explications sur le pourquoi du comment
Désolé. Ma bible pour Unicode et UTF-8 est la page suivante :
<http://www.cl.cam.ac.uk/~mgk25/unicode.html>
En particulier<http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8>
explique l'encodage de toutes les valeurs possibles entre U+0000 et
U+7FFFFFFF. Noter que ce tableau est trop grand, puisque la norme
actuelle interdit les valeurs plus grandes que U+10FFFF, ce qui limite
les valeurs UTF-8 à 4 octets au maximum.
Cela dit, la page de Wikipédia en français me semble très bien faite :
<http://fr.wikipedia.org/wiki/UTF-8>.
Je ne suis pas sûr de t'avoir compris :
En effet. Pour comprendre ce que je voulais dire, il faut savoir ce
qu'est ce caractère Unicode bizarre qui s'est appelé d'abord ZWNBSP
avant de s'appeler BOM, pourquoi il peut servir de BOM dans UTF-16 et
pourquoi « ça marche », avant de se poser la question de l'existence
d'un BOM en UTF-8 ou dans les autres encodages dont la base est l'octet
et pas un mot de 2 ou 4 octets.
dans les charsets ISO 8 bits, ce
sont les zones de 0x80 à 0x9F qui sont réservées,
Si en écrivant « réservées » tu veux dire « dont toutes les positions
sont invalides », alors ceci vaut seulement pour ceux tels que "ISO
8859-1" (sans trait d'union). Dans "ISO-8859-1", toutes les positions
sont définies, dont des caractères de commande aux valeurs 00 à 1F, 7F,
et 80 à 9F. Et puis bien sûr il y a des charsets 8 bits tels que cp1252
ou cp850 qui définissent des caractères imprimables à ces positions.
Euh... je suis preneur des explications sur le pourquoi du comment
Désolé. Ma bible pour Unicode et UTF-8 est la page suivante :
<http://www.cl.cam.ac.uk/~mgk25/unicode.html>
En particulier<http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8>
explique l'encodage de toutes les valeurs possibles entre U+0000 et
U+7FFFFFFF. Noter que ce tableau est trop grand, puisque la norme
actuelle interdit les valeurs plus grandes que U+10FFFF, ce qui limite
les valeurs UTF-8 à 4 octets au maximum.
Cela dit, la page de Wikipédia en français me semble très bien faite :
<http://fr.wikipedia.org/wiki/UTF-8>.
Je ne suis pas sûr de t'avoir compris :
En effet. Pour comprendre ce que je voulais dire, il faut savoir ce
qu'est ce caractère Unicode bizarre qui s'est appelé d'abord ZWNBSP
avant de s'appeler BOM, pourquoi il peut servir de BOM dans UTF-16 et
pourquoi « ça marche », avant de se poser la question de l'existence
d'un BOM en UTF-8 ou dans les autres encodages dont la base est l'octet
et pas un mot de 2 ou 4 octets.
dans les charsets ISO 8 bits, ce
sont les zones de 0x80 à 0x9F qui sont réservées,
Si en écrivant « réservées » tu veux dire « dont toutes les positions
sont invalides », alors ceci vaut seulement pour ceux tels que "ISO
8859-1" (sans trait d'union). Dans "ISO-8859-1", toutes les positions
sont définies, dont des caractères de commande aux valeurs 00 à 1F, 7F,
et 80 à 9F. Et puis bien sûr il y a des charsets 8 bits tels que cp1252
ou cp850 qui définissent des caractères imprimables à ces positions.
Euh... je suis preneur des explications sur le pourquoi du comment
Désolé. Ma bible pour Unicode et UTF-8 est la page suivante :
<http://www.cl.cam.ac.uk/~mgk25/unicode.html>
En particulier<http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8>
explique l'encodage de toutes les valeurs possibles entre U+0000 et
U+7FFFFFFF. Noter que ce tableau est trop grand, puisque la norme
actuelle interdit les valeurs plus grandes que U+10FFFF, ce qui limite
les valeurs UTF-8 à 4 octets au maximum.
Cela dit, la page de Wikipédia en français me semble très bien faite :
<http://fr.wikipedia.org/wiki/UTF-8>.
Olivier, mille mercis de ce complément très instructif !
[...]Si en écrivant « réservées » tu veux dire « dont toutes les positions
sont invalides », alors ceci vaut seulement pour ceux tels que "ISO
8859-1" (sans trait d'union). Dans "ISO-8859-1", toutes les positions
sont définies, dont des caractères de commande aux valeurs 00 à 1F, 7F,
et 80 à 9F. Et puis bien sûr il y a des charsets 8 bits tels que cp1252
ou cp850 qui définissent des caractères imprimables à ces positions.
cp1252 et cp850 ne sont pas des charsets ISO...
Olivier, mille mercis de ce complément très instructif !
[...]
Si en écrivant « réservées » tu veux dire « dont toutes les positions
sont invalides », alors ceci vaut seulement pour ceux tels que "ISO
8859-1" (sans trait d'union). Dans "ISO-8859-1", toutes les positions
sont définies, dont des caractères de commande aux valeurs 00 à 1F, 7F,
et 80 à 9F. Et puis bien sûr il y a des charsets 8 bits tels que cp1252
ou cp850 qui définissent des caractères imprimables à ces positions.
cp1252 et cp850 ne sont pas des charsets ISO...
Olivier, mille mercis de ce complément très instructif !
[...]Si en écrivant « réservées » tu veux dire « dont toutes les positions
sont invalides », alors ceci vaut seulement pour ceux tels que "ISO
8859-1" (sans trait d'union). Dans "ISO-8859-1", toutes les positions
sont définies, dont des caractères de commande aux valeurs 00 à 1F, 7F,
et 80 à 9F. Et puis bien sûr il y a des charsets 8 bits tels que cp1252
ou cp850 qui définissent des caractères imprimables à ces positions.
cp1252 et cp850 ne sont pas des charsets ISO...