Et donc pour répondre au PO, de mon point de vue, dans votre module,
il vous faut distinguer les méthodes/fonctions manipulant du texte et
celles manipulant des données. Ça doit être clair tant dans votre code
que dans la doc...
Celles qui manipulent du texte doivent l'émettre ou
le recevoir en utf-8
Et c'est d'autant plus vrai que je racontais des bêtises dans mon
premier message (pas très réveillé ce matin!) : un document XML ne
peut pas contenir de données binaires arbitraires !
Et donc pour répondre au PO, de mon point de vue, dans votre module,
il vous faut distinguer les méthodes/fonctions manipulant du texte et
celles manipulant des données. Ça doit être clair tant dans votre code
que dans la doc...
Celles qui manipulent du texte doivent l'émettre ou
le recevoir en utf-8
Et c'est d'autant plus vrai que je racontais des bêtises dans mon
premier message (pas très réveillé ce matin!) : un document XML ne
peut pas contenir de données binaires arbitraires !
Et donc pour répondre au PO, de mon point de vue, dans votre module,
il vous faut distinguer les méthodes/fonctions manipulant du texte et
celles manipulant des données. Ça doit être clair tant dans votre code
que dans la doc...
Celles qui manipulent du texte doivent l'émettre ou
le recevoir en utf-8
Et c'est d'autant plus vrai que je racontais des bêtises dans mon
premier message (pas très réveillé ce matin!) : un document XML ne
peut pas contenir de données binaires arbitraires !
Là où ça devient subtil, c'est ce qui se passe quand une chaîne d'octets et
une chaîne de caractères entrent en contact, par exemple par concaténation.
Apparemment, la chaîne d'octets est promue en chaîne de caractères en
préservant la valeur de chaque élément (ce qui, soit dit en passant, est
équivalent à Encode::decode("ISO-8859-1", ...)). Je pense qu'il vaut mieux
éviter de se retrouver dans une situation de ce genre. Il serait intéressant
d'avoir une paire de warnings "Unicode string used as byte string" / "Byte
string used as Unicode string".
Le problème de la doc de perl, c'est qu'elle utilise un peu partout le terme
utf-8 pour désigner ce que j'appelle les chaînes de caractères Unicode.
C'est une mauvaise chose parce que :
[...]
Je pense que le terme approprié est vraiment « chaîne de caractères
Unicode », puisque c'est précisément ça que les interfaces de perl nous
exposent.
Là où ça devient subtil, c'est ce qui se passe quand une chaîne d'octets et
une chaîne de caractères entrent en contact, par exemple par concaténation.
Apparemment, la chaîne d'octets est promue en chaîne de caractères en
préservant la valeur de chaque élément (ce qui, soit dit en passant, est
équivalent à Encode::decode("ISO-8859-1", ...)). Je pense qu'il vaut mieux
éviter de se retrouver dans une situation de ce genre. Il serait intéressant
d'avoir une paire de warnings "Unicode string used as byte string" / "Byte
string used as Unicode string".
Le problème de la doc de perl, c'est qu'elle utilise un peu partout le terme
utf-8 pour désigner ce que j'appelle les chaînes de caractères Unicode.
C'est une mauvaise chose parce que :
[...]
Je pense que le terme approprié est vraiment « chaîne de caractères
Unicode », puisque c'est précisément ça que les interfaces de perl nous
exposent.
Là où ça devient subtil, c'est ce qui se passe quand une chaîne d'octets et
une chaîne de caractères entrent en contact, par exemple par concaténation.
Apparemment, la chaîne d'octets est promue en chaîne de caractères en
préservant la valeur de chaque élément (ce qui, soit dit en passant, est
équivalent à Encode::decode("ISO-8859-1", ...)). Je pense qu'il vaut mieux
éviter de se retrouver dans une situation de ce genre. Il serait intéressant
d'avoir une paire de warnings "Unicode string used as byte string" / "Byte
string used as Unicode string".
Le problème de la doc de perl, c'est qu'elle utilise un peu partout le terme
utf-8 pour désigner ce que j'appelle les chaînes de caractères Unicode.
C'est une mauvaise chose parce que :
[...]
Je pense que le terme approprié est vraiment « chaîne de caractères
Unicode », puisque c'est précisément ça que les interfaces de perl nous
exposent.
En fait aucune de ces deux appelations ne sont bonnes puisque Perl
accepte de chaînes utf-8 (codage interne) invalides du point de vue
Unicode (sémantique applicative)...
De ce point de vue, Perl est parti de loin
(les premières tentatives d'intégration étaient catastrophiques) mais
l'état actuel, même si il n'est pas parfait, me semble tout de même
bien pensé et cohérent.
En fait aucune de ces deux appelations ne sont bonnes puisque Perl
accepte de chaînes utf-8 (codage interne) invalides du point de vue
Unicode (sémantique applicative)...
De ce point de vue, Perl est parti de loin
(les premières tentatives d'intégration étaient catastrophiques) mais
l'état actuel, même si il n'est pas parfait, me semble tout de même
bien pensé et cohérent.
En fait aucune de ces deux appelations ne sont bonnes puisque Perl
accepte de chaînes utf-8 (codage interne) invalides du point de vue
Unicode (sémantique applicative)...
De ce point de vue, Perl est parti de loin
(les premières tentatives d'intégration étaient catastrophiques) mais
l'état actuel, même si il n'est pas parfait, me semble tout de même
bien pensé et cohérent.
Tu peux donner un exemple plus précis ? Tu veux parler de l'utilisation
invalide de combinants ?
Tu peux donner un exemple plus précis ? Tu veux parler de l'utilisation
invalide de combinants ?
Tu peux donner un exemple plus précis ? Tu veux parler de l'utilisation
invalide de combinants ?
Si toute suite d'octets peut-être converti en une chaîne
Unicode/UTF-8, c'est que Perl accepte de suites d'octets ne
représentant aucun caractère Unicode (et donc invalide) en UTF-8.
Je
ne sais pas si c'est ça que vous appelez une "utilisation invalide de
combinants" ?
Si toute suite d'octets peut-être converti en une chaîne
Unicode/UTF-8, c'est que Perl accepte de suites d'octets ne
représentant aucun caractère Unicode (et donc invalide) en UTF-8.
Je
ne sais pas si c'est ça que vous appelez une "utilisation invalide de
combinants" ?
Si toute suite d'octets peut-être converti en une chaîne
Unicode/UTF-8, c'est que Perl accepte de suites d'octets ne
représentant aucun caractère Unicode (et donc invalide) en UTF-8.
Je
ne sais pas si c'est ça que vous appelez une "utilisation invalide de
combinants" ?
Je ne comprends toujours pas de quoi tu veux parler. Je vois deux
interprétations possibles :
- Accepter une suite d'octets du style « 0xA9 0xC3 », qui n'est
effectivement pas de l'UTF-8 valide. Mais non, puisque de fait, Perl
n'accepte pas ça.
- Accepter une suite d'octets comme « 0xFC 0x92 0x8D 0x85 0x99 0xB8 », qui
est bien de l'UTF-8 valide, mais ne représente pas un caractère Unicode
existant, ni même pouvant exister (Unicode s'arrête à U+10FFFD).
C'est de ce dernier point que tu voulais parler ?
Je
ne sais pas si c'est ça que vous appelez une "utilisation invalide de
combinants" ?
Non, je pensais en l'occurence à accepter une chaîne du style :
my $t = "x{0301}";
qui n'est pas correcte puisque U+0301 est un combinant (COMBINING ACUTE
ACCENT) et qu'il n'a rien avec quoi se combiner.
Je ne comprends toujours pas de quoi tu veux parler. Je vois deux
interprétations possibles :
- Accepter une suite d'octets du style « 0xA9 0xC3 », qui n'est
effectivement pas de l'UTF-8 valide. Mais non, puisque de fait, Perl
n'accepte pas ça.
- Accepter une suite d'octets comme « 0xFC 0x92 0x8D 0x85 0x99 0xB8 », qui
est bien de l'UTF-8 valide, mais ne représente pas un caractère Unicode
existant, ni même pouvant exister (Unicode s'arrête à U+10FFFD).
C'est de ce dernier point que tu voulais parler ?
Je
ne sais pas si c'est ça que vous appelez une "utilisation invalide de
combinants" ?
Non, je pensais en l'occurence à accepter une chaîne du style :
my $t = "x{0301}";
qui n'est pas correcte puisque U+0301 est un combinant (COMBINING ACUTE
ACCENT) et qu'il n'a rien avec quoi se combiner.
Je ne comprends toujours pas de quoi tu veux parler. Je vois deux
interprétations possibles :
- Accepter une suite d'octets du style « 0xA9 0xC3 », qui n'est
effectivement pas de l'UTF-8 valide. Mais non, puisque de fait, Perl
n'accepte pas ça.
- Accepter une suite d'octets comme « 0xFC 0x92 0x8D 0x85 0x99 0xB8 », qui
est bien de l'UTF-8 valide, mais ne représente pas un caractère Unicode
existant, ni même pouvant exister (Unicode s'arrête à U+10FFFD).
C'est de ce dernier point que tu voulais parler ?
Je
ne sais pas si c'est ça que vous appelez une "utilisation invalide de
combinants" ?
Non, je pensais en l'occurence à accepter une chaîne du style :
my $t = "x{0301}";
qui n'est pas correcte puisque U+0301 est un combinant (COMBINING ACUTE
ACCENT) et qu'il n'a rien avec quoi se combiner.
Je viens de refaire des tests... et je m'aperçois qu'effectivement, ça
a encore changé (mes derniers tests devaient datés de la 5.8.4 ou
avant). Avant, Perl acceptait tout. Maintenant non.
D'ailleurs, la décision d'arrêt à U+10FFFD est-elle définitive ?
Par exemple, avec le script suivant (test.pl) :
binmode(STDOUT, ":utf8");
my $t = "x{20}x{41}x{ff}";
print "$t";
On teste :
% perl -w test.pl | od -x
0000000 2041 c3bf
0000004
D'où provient le 'c3bf' ?
un x{0301} est transformé en 'cc81'...
Je viens de refaire des tests... et je m'aperçois qu'effectivement, ça
a encore changé (mes derniers tests devaient datés de la 5.8.4 ou
avant). Avant, Perl acceptait tout. Maintenant non.
D'ailleurs, la décision d'arrêt à U+10FFFD est-elle définitive ?
Par exemple, avec le script suivant (test.pl) :
binmode(STDOUT, ":utf8");
my $t = "x{20}x{41}x{ff}";
print "$t";
On teste :
% perl -w test.pl | od -x
0000000 2041 c3bf
0000004
D'où provient le 'c3bf' ?
un x{0301} est transformé en 'cc81'...
Je viens de refaire des tests... et je m'aperçois qu'effectivement, ça
a encore changé (mes derniers tests devaient datés de la 5.8.4 ou
avant). Avant, Perl acceptait tout. Maintenant non.
D'ailleurs, la décision d'arrêt à U+10FFFD est-elle définitive ?
Par exemple, avec le script suivant (test.pl) :
binmode(STDOUT, ":utf8");
my $t = "x{20}x{41}x{ff}";
print "$t";
On teste :
% perl -w test.pl | od -x
0000000 2041 c3bf
0000004
D'où provient le 'c3bf' ?
un x{0301} est transformé en 'cc81'...
Paul Gaborit wrote in message :Je viens de refaire des tests... et je m'aperçois qu'effectivement, ça
a encore changé (mes derniers tests devaient datés de la 5.8.4 ou
avant). Avant, Perl acceptait tout. Maintenant non.
Ça me paraît bizarre, dans la mesure où justement on n'a jamais accès à la
représentation interne des chaînes.
Paul Gaborit wrote in message <r77j7ucd3p.fsf@vaugirard.enstimac.fr>:
Je viens de refaire des tests... et je m'aperçois qu'effectivement, ça
a encore changé (mes derniers tests devaient datés de la 5.8.4 ou
avant). Avant, Perl acceptait tout. Maintenant non.
Ça me paraît bizarre, dans la mesure où justement on n'a jamais accès à la
représentation interne des chaînes.
Paul Gaborit wrote in message :Je viens de refaire des tests... et je m'aperçois qu'effectivement, ça
a encore changé (mes derniers tests devaient datés de la 5.8.4 ou
avant). Avant, Perl acceptait tout. Maintenant non.
Ça me paraît bizarre, dans la mesure où justement on n'a jamais accès à la
représentation interne des chaînes.