Ah, je ne savais pas... Sur mon VC 7.1, ça fonctionne, mais je
veux bien croire que ce ne serait pas le cas partout.
Je n'ai pas accès à un VC 7.1, mais avec VC 6.0, compilé avec
les options par défaut, ça ne marche pas. Essaie, par exemple,
toupper('ÿ').
Stroustrup aurait écrit quelque chose non conforme ?
Disons qu'il a écrit quelque chose qui ne marche pas avec des
compilateurs auquels j'ai accès : Sun CC 5.1, VC++ 6.0 et g++
(plusieurs versions). Quelque chose qui n'a jamais marché, depuis les
premiers jours de C.
En fait, le but initial, je crois, c'était qu'on puisse les utiliser
de façon :
int ch = getchar() ;
while ( isspace( ch ) ) ...
sans problème, même dans le cas de EOF. Ce qui marche
parfaitement. Le problème, c'est que raisonablement, il fallait
restreindre l'étendu qu'elles acceptent en entrée --
l'implémentation classique, qu'on a voulu laisser légale, c'est un
tableau, et on ne peut guère accepter un tableau de INT_MAX-INT_MIN
éléments. La règle donc, c'est qu'il faut que ch soit dans
l'étendue [0...UCHAR_MAX] ou qu'il vaut EOF (qui doit être
négatif, et qui est typiquement -1).
Or, dans beaucoup d'implémentations courantes : g++, Sun CC, et VC++
sans option particulière, par exemple, char est un type signé.
Ça veut dire que quand on convertit un char en int, on se retrouve
avec des valeurs négatives -- qui ne se trouve pas dans l'étendue
[0...UCHAR_MAX] donc. D'où un comportement indéfini. Le cas de
'ÿ' est particulièrement pernicieux, parce que avec ISO 8859-n, et
des char de 8 bits, sa valeur est -1 -- du coup, le comportement est
défini, mais pas ce qu'on veut : islower( 'ÿ' ) rend faux.
(pour autoriser des caractères sur plusieurs octets plus tard ?)
Mais c'est le cas de toutes les fonctions 'is*' (come isalpha,
isupper, etc...). Et je doute qu'utiliser une de ces fonctions en
C++ avec un argument char (qui sera donc converti en int) soit
implementation-defined... Sinon, à quoi serviraient ces fonctions
?
Ensuite, il y a le problème que sur la plupart des implémentations
aujourd'hui, pour diverses raisons historiques, char est signé.
C-à-d qu'il peut prendre des valeurs négatives, et même que
dans la pratique, étant donné qu'il a en général huit bits,
il prend réelement des valeurs négatives. Valeurs qui sont
maintenues lors de la conversion de char en int, et qui donne un
comportement indéfini à des fonctions isxxx dans <ctype.h> (ou
<cctype>).
Historiquement, en C, la pratique courante était d'utiliser une
conversion explicite : isxxx( (unsigned char)ch ). C'est vrai qu'il y
avait beaucoup d'américains qui ne le faisait pas -- il ne
rencontrait pas de caractères accentués dans leurs fichiers, et
ça donnait l'air de marcher. Mais c'était une pratique
systèmatique dans toutes les boîtes européenes où j'ai
travaillé, depuis au moins quinze ans.
OK. Mais alors, comment faire un cmp_nocase en C++ portable ? Ne me
dis pas que c'est impossible !!! ;-)
C'est impossible:-).
Sérieusement, beaucoup dépend de tes besoins. Dans l'absolu, c'est
impossible, mais souvent, tu n'as pas besoin de traiter tous les
caractères du monde, dans tous les locales possibles. Alors, des
compromises peuvent être considérer. Si le problème ne concerne
que ISO-8859-1, par exemple, il suffit d'utiliser le code ci-dessus,
en ajoutant des conversions vers unsigned char sur les paramètres.
Ah, je ne savais pas... Sur mon VC 7.1, ça fonctionne, mais je
veux bien croire que ce ne serait pas le cas partout.
Je n'ai pas accès à un VC 7.1, mais avec VC 6.0, compilé avec
les options par défaut, ça ne marche pas. Essaie, par exemple,
toupper('ÿ').
Stroustrup aurait écrit quelque chose non conforme ?
Disons qu'il a écrit quelque chose qui ne marche pas avec des
compilateurs auquels j'ai accès : Sun CC 5.1, VC++ 6.0 et g++
(plusieurs versions). Quelque chose qui n'a jamais marché, depuis les
premiers jours de C.
En fait, le but initial, je crois, c'était qu'on puisse les utiliser
de façon :
int ch = getchar() ;
while ( isspace( ch ) ) ...
sans problème, même dans le cas de EOF. Ce qui marche
parfaitement. Le problème, c'est que raisonablement, il fallait
restreindre l'étendu qu'elles acceptent en entrée --
l'implémentation classique, qu'on a voulu laisser légale, c'est un
tableau, et on ne peut guère accepter un tableau de INT_MAX-INT_MIN
éléments. La règle donc, c'est qu'il faut que ch soit dans
l'étendue [0...UCHAR_MAX] ou qu'il vaut EOF (qui doit être
négatif, et qui est typiquement -1).
Or, dans beaucoup d'implémentations courantes : g++, Sun CC, et VC++
sans option particulière, par exemple, char est un type signé.
Ça veut dire que quand on convertit un char en int, on se retrouve
avec des valeurs négatives -- qui ne se trouve pas dans l'étendue
[0...UCHAR_MAX] donc. D'où un comportement indéfini. Le cas de
'ÿ' est particulièrement pernicieux, parce que avec ISO 8859-n, et
des char de 8 bits, sa valeur est -1 -- du coup, le comportement est
défini, mais pas ce qu'on veut : islower( 'ÿ' ) rend faux.
(pour autoriser des caractères sur plusieurs octets plus tard ?)
Mais c'est le cas de toutes les fonctions 'is*' (come isalpha,
isupper, etc...). Et je doute qu'utiliser une de ces fonctions en
C++ avec un argument char (qui sera donc converti en int) soit
implementation-defined... Sinon, à quoi serviraient ces fonctions
?
Ensuite, il y a le problème que sur la plupart des implémentations
aujourd'hui, pour diverses raisons historiques, char est signé.
C-à-d qu'il peut prendre des valeurs négatives, et même que
dans la pratique, étant donné qu'il a en général huit bits,
il prend réelement des valeurs négatives. Valeurs qui sont
maintenues lors de la conversion de char en int, et qui donne un
comportement indéfini à des fonctions isxxx dans <ctype.h> (ou
<cctype>).
Historiquement, en C, la pratique courante était d'utiliser une
conversion explicite : isxxx( (unsigned char)ch ). C'est vrai qu'il y
avait beaucoup d'américains qui ne le faisait pas -- il ne
rencontrait pas de caractères accentués dans leurs fichiers, et
ça donnait l'air de marcher. Mais c'était une pratique
systèmatique dans toutes les boîtes européenes où j'ai
travaillé, depuis au moins quinze ans.
OK. Mais alors, comment faire un cmp_nocase en C++ portable ? Ne me
dis pas que c'est impossible !!! ;-)
C'est impossible:-).
Sérieusement, beaucoup dépend de tes besoins. Dans l'absolu, c'est
impossible, mais souvent, tu n'as pas besoin de traiter tous les
caractères du monde, dans tous les locales possibles. Alors, des
compromises peuvent être considérer. Si le problème ne concerne
que ISO-8859-1, par exemple, il suffit d'utiliser le code ci-dessus,
en ajoutant des conversions vers unsigned char sur les paramètres.
Ah, je ne savais pas... Sur mon VC 7.1, ça fonctionne, mais je
veux bien croire que ce ne serait pas le cas partout.
Je n'ai pas accès à un VC 7.1, mais avec VC 6.0, compilé avec
les options par défaut, ça ne marche pas. Essaie, par exemple,
toupper('ÿ').
Stroustrup aurait écrit quelque chose non conforme ?
Disons qu'il a écrit quelque chose qui ne marche pas avec des
compilateurs auquels j'ai accès : Sun CC 5.1, VC++ 6.0 et g++
(plusieurs versions). Quelque chose qui n'a jamais marché, depuis les
premiers jours de C.
En fait, le but initial, je crois, c'était qu'on puisse les utiliser
de façon :
int ch = getchar() ;
while ( isspace( ch ) ) ...
sans problème, même dans le cas de EOF. Ce qui marche
parfaitement. Le problème, c'est que raisonablement, il fallait
restreindre l'étendu qu'elles acceptent en entrée --
l'implémentation classique, qu'on a voulu laisser légale, c'est un
tableau, et on ne peut guère accepter un tableau de INT_MAX-INT_MIN
éléments. La règle donc, c'est qu'il faut que ch soit dans
l'étendue [0...UCHAR_MAX] ou qu'il vaut EOF (qui doit être
négatif, et qui est typiquement -1).
Or, dans beaucoup d'implémentations courantes : g++, Sun CC, et VC++
sans option particulière, par exemple, char est un type signé.
Ça veut dire que quand on convertit un char en int, on se retrouve
avec des valeurs négatives -- qui ne se trouve pas dans l'étendue
[0...UCHAR_MAX] donc. D'où un comportement indéfini. Le cas de
'ÿ' est particulièrement pernicieux, parce que avec ISO 8859-n, et
des char de 8 bits, sa valeur est -1 -- du coup, le comportement est
défini, mais pas ce qu'on veut : islower( 'ÿ' ) rend faux.
(pour autoriser des caractères sur plusieurs octets plus tard ?)
Mais c'est le cas de toutes les fonctions 'is*' (come isalpha,
isupper, etc...). Et je doute qu'utiliser une de ces fonctions en
C++ avec un argument char (qui sera donc converti en int) soit
implementation-defined... Sinon, à quoi serviraient ces fonctions
?
Ensuite, il y a le problème que sur la plupart des implémentations
aujourd'hui, pour diverses raisons historiques, char est signé.
C-à-d qu'il peut prendre des valeurs négatives, et même que
dans la pratique, étant donné qu'il a en général huit bits,
il prend réelement des valeurs négatives. Valeurs qui sont
maintenues lors de la conversion de char en int, et qui donne un
comportement indéfini à des fonctions isxxx dans <ctype.h> (ou
<cctype>).
Historiquement, en C, la pratique courante était d'utiliser une
conversion explicite : isxxx( (unsigned char)ch ). C'est vrai qu'il y
avait beaucoup d'américains qui ne le faisait pas -- il ne
rencontrait pas de caractères accentués dans leurs fichiers, et
ça donnait l'air de marcher. Mais c'était une pratique
systèmatique dans toutes les boîtes européenes où j'ai
travaillé, depuis au moins quinze ans.
OK. Mais alors, comment faire un cmp_nocase en C++ portable ? Ne me
dis pas que c'est impossible !!! ;-)
C'est impossible:-).
Sérieusement, beaucoup dépend de tes besoins. Dans l'absolu, c'est
impossible, mais souvent, tu n'as pas besoin de traiter tous les
caractères du monde, dans tous les locales possibles. Alors, des
compromises peuvent être considérer. Si le problème ne concerne
que ISO-8859-1, par exemple, il suffit d'utiliser le code ci-dessus,
en ajoutant des conversions vers unsigned char sur les paramètres.
Fabien LE LEZ writes:Y'a pas à dire, le C++, c'est de la merde ! ;-) Au fait,
existe-t-il des systèmes où les 52 lettres ([A-Za-z]) ne sont
pas (toutes) présentes ?
Italien. Il n'y a pas de J, K, W, X, ou Y.
Fabien LE LEZ <gramster@gramster.com> writes:
Y'a pas à dire, le C++, c'est de la merde ! ;-) Au fait,
existe-t-il des systèmes où les 52 lettres ([A-Za-z]) ne sont
pas (toutes) présentes ?
Italien. Il n'y a pas de J, K, W, X, ou Y.
Fabien LE LEZ writes:Y'a pas à dire, le C++, c'est de la merde ! ;-) Au fait,
existe-t-il des systèmes où les 52 lettres ([A-Za-z]) ne sont
pas (toutes) présentes ?
Italien. Il n'y a pas de J, K, W, X, ou Y.
À titre d'exemple : tu donnes un fichier avec les noms des villes du
banlieu parisien à un programme écrit en C. Il y en aurait pas mal
qui s'arrête pile au milieu de la ligne avec Le-Haÿ-des-Roses.
À titre d'exemple : tu donnes un fichier avec les noms des villes du
banlieu parisien à un programme écrit en C. Il y en aurait pas mal
qui s'arrête pile au milieu de la ligne avec Le-Haÿ-des-Roses.
À titre d'exemple : tu donnes un fichier avec les noms des villes du
banlieu parisien à un programme écrit en C. Il y en aurait pas mal
qui s'arrête pile au milieu de la ligne avec Le-Haÿ-des-Roses.
Non. Ça a dailleurs posé des problèmes à ma femme (italienne) lorsqu'on
s'est marié.
Non. Ça a dailleurs posé des problèmes à ma femme (italienne) lorsqu'on
s'est marié.
Non. Ça a dailleurs posé des problèmes à ma femme (italienne) lorsqu'on
s'est marié.
James Kanze wrote:En fait, le but initial, je crois, c'était qu'on puisse les utiliser
de façon :
int ch = getchar() ;
while ( isspace( ch ) ) ...
sans problème, même dans le cas de EOF. Ce qui marche parfaitement.
Le problème, c'est que raisonablement, il fallait restreindre
l'étendu qu'elles acceptent en entrée -- l'implémentation classique,
qu'on a voulu laisser légale, c'est un tableau, et on ne peut guère
accepter un tableau de INT_MAX-INT_MIN éléments. La règle donc,
c'est qu'il faut que ch soit dans l'étendue [0...UCHAR_MAX] ou qu'il
vaut EOF (qui doit être négatif, et qui est typiquement -1).
Or, dans beaucoup d'implémentations courantes : g++, Sun CC, et VC++
sans option particulière, par exemple, char est un type signé. Ça
veut dire que quand on convertit un char en int, on se retrouve avec
des valeurs négatives -- qui ne se trouve pas dans l'étendue
[0...UCHAR_MAX] donc. D'où un comportement indéfini. Le cas de 'ÿ'
est particulièrement pernicieux, parce que avec ISO 8859-n, et des
char de 8 bits, sa valeur est -1 -- du coup, le comportement est
défini, mais pas ce qu'on veut : islower( 'ÿ' ) rend faux.
D'accord, je comprends le coup du int. En fait, les fonctions 'isxxx'
utilisent le locale "C" (c'est-à-dire ASCII ?) ?
Du coup, si on veut utiliser le ISO-8859-1, comment on peut faire avec
les 'isxxx' ?? On ne peut pas ?
(Au fait, quelle est la différence entre ISO-8859-1 et ASCII ? Je
crois que les 128 premiers caractères sont les mêmes et que seules les
suivants diffèrent, c'est bien ça ?).
(pour autoriser des caractères sur plusieurs octets plus tard ?)
Mais c'est le cas de toutes les fonctions 'is*' (come isalpha,
isupper, etc...). Et je doute qu'utiliser une de ces fonctions en
C++ avec un argument char (qui sera donc converti en int) soit
implementation-defined... Sinon, à quoi serviraient ces fonctions
?
[...]Ensuite, il y a le problème que sur la plupart des implémentations
aujourd'hui, pour diverses raisons historiques, char est signé.
C-à-d qu'il peut prendre des valeurs négatives, et même que
dans la pratique, étant donné qu'il a en général huit bits,
il prend réelement des valeurs négatives. Valeurs qui sont
maintenues lors de la conversion de char en int, et qui donne un
comportement indéfini à des fonctions isxxx dans <ctype.h> (ou
<cctype>).
OK.Historiquement, en C, la pratique courante était d'utiliser une
conversion explicite : isxxx( (unsigned char)ch ). C'est vrai qu'il
y avait beaucoup d'américains qui ne le faisait pas -- il ne
rencontrait pas de caractères accentués dans leurs fichiers, et ça
donnait l'air de marcher. Mais c'était une pratique systèmatique
dans toutes les boîtes européenes où j'ai travaillé, depuis au moins
quinze ans.
C'est vrai que c'est un bon workaround. Ca serait inutile dans VC 7.1
si on active le "Default char unsigned". Mais cette option n'est pas
activée par défaut... :(
OK. Mais alors, comment faire un cmp_nocase en C++ portable ? Ne
me dis pas que c'est impossible !!! ;-)
C'est impossible:-).
;-)Sérieusement, beaucoup dépend de tes besoins. Dans l'absolu, c'est
impossible, mais souvent, tu n'as pas besoin de traiter tous les
caractères du monde, dans tous les locales possibles. Alors, des
compromises peuvent être considérer. Si le problème ne concerne que
ISO-8859-1, par exemple, il suffit d'utiliser le code ci-dessus, en
ajoutant des conversions vers unsigned char sur les paramètres.
Il est vrai que je ne veux pas gérer tous les alphabets mondiaux ;-)
Mais si je pouvais gérer correctement et entièrement le français (et
donc européen, avec l'allemand, l'espagnol, etc...), y compris le
fourbe 'ÿ', ça serait sympa :-) Ca marcherait en mettant seulement un
cast 'unsigned char' dessus ?
Et les histoires de locale s'accordent si on reste en ASCII ?
Est-il possible de définir sa (/son ?) propre locale pour avoir le bon
comportement ?
James Kanze wrote:
En fait, le but initial, je crois, c'était qu'on puisse les utiliser
de façon :
int ch = getchar() ;
while ( isspace( ch ) ) ...
sans problème, même dans le cas de EOF. Ce qui marche parfaitement.
Le problème, c'est que raisonablement, il fallait restreindre
l'étendu qu'elles acceptent en entrée -- l'implémentation classique,
qu'on a voulu laisser légale, c'est un tableau, et on ne peut guère
accepter un tableau de INT_MAX-INT_MIN éléments. La règle donc,
c'est qu'il faut que ch soit dans l'étendue [0...UCHAR_MAX] ou qu'il
vaut EOF (qui doit être négatif, et qui est typiquement -1).
Or, dans beaucoup d'implémentations courantes : g++, Sun CC, et VC++
sans option particulière, par exemple, char est un type signé. Ça
veut dire que quand on convertit un char en int, on se retrouve avec
des valeurs négatives -- qui ne se trouve pas dans l'étendue
[0...UCHAR_MAX] donc. D'où un comportement indéfini. Le cas de 'ÿ'
est particulièrement pernicieux, parce que avec ISO 8859-n, et des
char de 8 bits, sa valeur est -1 -- du coup, le comportement est
défini, mais pas ce qu'on veut : islower( 'ÿ' ) rend faux.
D'accord, je comprends le coup du int. En fait, les fonctions 'isxxx'
utilisent le locale "C" (c'est-à-dire ASCII ?) ?
Du coup, si on veut utiliser le ISO-8859-1, comment on peut faire avec
les 'isxxx' ?? On ne peut pas ?
(Au fait, quelle est la différence entre ISO-8859-1 et ASCII ? Je
crois que les 128 premiers caractères sont les mêmes et que seules les
suivants diffèrent, c'est bien ça ?).
(pour autoriser des caractères sur plusieurs octets plus tard ?)
Mais c'est le cas de toutes les fonctions 'is*' (come isalpha,
isupper, etc...). Et je doute qu'utiliser une de ces fonctions en
C++ avec un argument char (qui sera donc converti en int) soit
implementation-defined... Sinon, à quoi serviraient ces fonctions
?
[...]
Ensuite, il y a le problème que sur la plupart des implémentations
aujourd'hui, pour diverses raisons historiques, char est signé.
C-à-d qu'il peut prendre des valeurs négatives, et même que
dans la pratique, étant donné qu'il a en général huit bits,
il prend réelement des valeurs négatives. Valeurs qui sont
maintenues lors de la conversion de char en int, et qui donne un
comportement indéfini à des fonctions isxxx dans <ctype.h> (ou
<cctype>).
OK.
Historiquement, en C, la pratique courante était d'utiliser une
conversion explicite : isxxx( (unsigned char)ch ). C'est vrai qu'il
y avait beaucoup d'américains qui ne le faisait pas -- il ne
rencontrait pas de caractères accentués dans leurs fichiers, et ça
donnait l'air de marcher. Mais c'était une pratique systèmatique
dans toutes les boîtes européenes où j'ai travaillé, depuis au moins
quinze ans.
C'est vrai que c'est un bon workaround. Ca serait inutile dans VC 7.1
si on active le "Default char unsigned". Mais cette option n'est pas
activée par défaut... :(
OK. Mais alors, comment faire un cmp_nocase en C++ portable ? Ne
me dis pas que c'est impossible !!! ;-)
C'est impossible:-).
;-)
Sérieusement, beaucoup dépend de tes besoins. Dans l'absolu, c'est
impossible, mais souvent, tu n'as pas besoin de traiter tous les
caractères du monde, dans tous les locales possibles. Alors, des
compromises peuvent être considérer. Si le problème ne concerne que
ISO-8859-1, par exemple, il suffit d'utiliser le code ci-dessus, en
ajoutant des conversions vers unsigned char sur les paramètres.
Il est vrai que je ne veux pas gérer tous les alphabets mondiaux ;-)
Mais si je pouvais gérer correctement et entièrement le français (et
donc européen, avec l'allemand, l'espagnol, etc...), y compris le
fourbe 'ÿ', ça serait sympa :-) Ca marcherait en mettant seulement un
cast 'unsigned char' dessus ?
Et les histoires de locale s'accordent si on reste en ASCII ?
Est-il possible de définir sa (/son ?) propre locale pour avoir le bon
comportement ?
James Kanze wrote:En fait, le but initial, je crois, c'était qu'on puisse les utiliser
de façon :
int ch = getchar() ;
while ( isspace( ch ) ) ...
sans problème, même dans le cas de EOF. Ce qui marche parfaitement.
Le problème, c'est que raisonablement, il fallait restreindre
l'étendu qu'elles acceptent en entrée -- l'implémentation classique,
qu'on a voulu laisser légale, c'est un tableau, et on ne peut guère
accepter un tableau de INT_MAX-INT_MIN éléments. La règle donc,
c'est qu'il faut que ch soit dans l'étendue [0...UCHAR_MAX] ou qu'il
vaut EOF (qui doit être négatif, et qui est typiquement -1).
Or, dans beaucoup d'implémentations courantes : g++, Sun CC, et VC++
sans option particulière, par exemple, char est un type signé. Ça
veut dire que quand on convertit un char en int, on se retrouve avec
des valeurs négatives -- qui ne se trouve pas dans l'étendue
[0...UCHAR_MAX] donc. D'où un comportement indéfini. Le cas de 'ÿ'
est particulièrement pernicieux, parce que avec ISO 8859-n, et des
char de 8 bits, sa valeur est -1 -- du coup, le comportement est
défini, mais pas ce qu'on veut : islower( 'ÿ' ) rend faux.
D'accord, je comprends le coup du int. En fait, les fonctions 'isxxx'
utilisent le locale "C" (c'est-à-dire ASCII ?) ?
Du coup, si on veut utiliser le ISO-8859-1, comment on peut faire avec
les 'isxxx' ?? On ne peut pas ?
(Au fait, quelle est la différence entre ISO-8859-1 et ASCII ? Je
crois que les 128 premiers caractères sont les mêmes et que seules les
suivants diffèrent, c'est bien ça ?).
(pour autoriser des caractères sur plusieurs octets plus tard ?)
Mais c'est le cas de toutes les fonctions 'is*' (come isalpha,
isupper, etc...). Et je doute qu'utiliser une de ces fonctions en
C++ avec un argument char (qui sera donc converti en int) soit
implementation-defined... Sinon, à quoi serviraient ces fonctions
?
[...]Ensuite, il y a le problème que sur la plupart des implémentations
aujourd'hui, pour diverses raisons historiques, char est signé.
C-à-d qu'il peut prendre des valeurs négatives, et même que
dans la pratique, étant donné qu'il a en général huit bits,
il prend réelement des valeurs négatives. Valeurs qui sont
maintenues lors de la conversion de char en int, et qui donne un
comportement indéfini à des fonctions isxxx dans <ctype.h> (ou
<cctype>).
OK.Historiquement, en C, la pratique courante était d'utiliser une
conversion explicite : isxxx( (unsigned char)ch ). C'est vrai qu'il
y avait beaucoup d'américains qui ne le faisait pas -- il ne
rencontrait pas de caractères accentués dans leurs fichiers, et ça
donnait l'air de marcher. Mais c'était une pratique systèmatique
dans toutes les boîtes européenes où j'ai travaillé, depuis au moins
quinze ans.
C'est vrai que c'est un bon workaround. Ca serait inutile dans VC 7.1
si on active le "Default char unsigned". Mais cette option n'est pas
activée par défaut... :(
OK. Mais alors, comment faire un cmp_nocase en C++ portable ? Ne
me dis pas que c'est impossible !!! ;-)
C'est impossible:-).
;-)Sérieusement, beaucoup dépend de tes besoins. Dans l'absolu, c'est
impossible, mais souvent, tu n'as pas besoin de traiter tous les
caractères du monde, dans tous les locales possibles. Alors, des
compromises peuvent être considérer. Si le problème ne concerne que
ISO-8859-1, par exemple, il suffit d'utiliser le code ci-dessus, en
ajoutant des conversions vers unsigned char sur les paramètres.
Il est vrai que je ne veux pas gérer tous les alphabets mondiaux ;-)
Mais si je pouvais gérer correctement et entièrement le français (et
donc européen, avec l'allemand, l'espagnol, etc...), y compris le
fourbe 'ÿ', ça serait sympa :-) Ca marcherait en mettant seulement un
cast 'unsigned char' dessus ?
Et les histoires de locale s'accordent si on reste en ASCII ?
Est-il possible de définir sa (/son ?) propre locale pour avoir le bon
comportement ?
On 21 Sep 2003, James Kanze wrote:À titre d'exemple : tu donnes un fichier avec les noms des villes du
banlieu parisien à un programme écrit en C. Il y en aurait pas mal
qui s'arrête pile au milieu de la ligne avec Le-Haÿ-des-Roses.
Pour y avoir habité pendant 15 ans, je confirme que ça s'écrit bien
L'Haÿ-les-roses, même si ça commence par un H (comme hôpital,
l'hôpital, et pas haricot, le haricot).
On 21 Sep 2003, James Kanze wrote:
À titre d'exemple : tu donnes un fichier avec les noms des villes du
banlieu parisien à un programme écrit en C. Il y en aurait pas mal
qui s'arrête pile au milieu de la ligne avec Le-Haÿ-des-Roses.
Pour y avoir habité pendant 15 ans, je confirme que ça s'écrit bien
L'Haÿ-les-roses, même si ça commence par un H (comme hôpital,
l'hôpital, et pas haricot, le haricot).
On 21 Sep 2003, James Kanze wrote:À titre d'exemple : tu donnes un fichier avec les noms des villes du
banlieu parisien à un programme écrit en C. Il y en aurait pas mal
qui s'arrête pile au milieu de la ligne avec Le-Haÿ-des-Roses.
Pour y avoir habité pendant 15 ans, je confirme que ça s'écrit bien
L'Haÿ-les-roses, même si ça commence par un H (comme hôpital,
l'hôpital, et pas haricot, le haricot).
a écrit dans le message de
news:Je n'y suis jamais habité, et j'avoue que la
seule chose que je connais de la ville, c'est que c'est la plus grande
commune en France avec un ÿ dans son nom:-). Pour la reste, j'ai bien vu
des panneaux sur l'A 86 en passant, mais je n'y ai jamais prété trop
d'attention.
Il me semble me souvenir que c'était aussi un terminus du RER à une époque
<kanze@gabi-soft.fr> a écrit dans le message de
news:d6652001.0309220518.72074a8c@posting.google.com...
Je n'y suis jamais habité, et j'avoue que la
seule chose que je connais de la ville, c'est que c'est la plus grande
commune en France avec un ÿ dans son nom:-). Pour la reste, j'ai bien vu
des panneaux sur l'A 86 en passant, mais je n'y ai jamais prété trop
d'attention.
Il me semble me souvenir que c'était aussi un terminus du RER à une époque
a écrit dans le message de
news:Je n'y suis jamais habité, et j'avoue que la
seule chose que je connais de la ville, c'est que c'est la plus grande
commune en France avec un ÿ dans son nom:-). Pour la reste, j'ai bien vu
des panneaux sur l'A 86 en passant, mais je n'y ai jamais prété trop
d'attention.
Il me semble me souvenir que c'était aussi un terminus du RER à une époque
a écrit dans le message de
news:Je n'y suis jamais habité, et j'avoue que la
seule chose que je connais de la ville, c'est que c'est la plus grande
commune en France avec un ÿ dans son nom:-). Pour la reste, j'ai bien vu
des panneaux sur l'A 86 en passant, mais je n'y ai jamais prété trop
d'attention.
Il me semble me souvenir que c'était aussi un terminus du RER à une époque
<kanze@gabi-soft.fr> a écrit dans le message de
news:d6652001.0309220518.72074a8c@posting.google.com...
Je n'y suis jamais habité, et j'avoue que la
seule chose que je connais de la ville, c'est que c'est la plus grande
commune en France avec un ÿ dans son nom:-). Pour la reste, j'ai bien vu
des panneaux sur l'A 86 en passant, mais je n'y ai jamais prété trop
d'attention.
Il me semble me souvenir que c'était aussi un terminus du RER à une époque
a écrit dans le message de
news:Je n'y suis jamais habité, et j'avoue que la
seule chose que je connais de la ville, c'est que c'est la plus grande
commune en France avec un ÿ dans son nom:-). Pour la reste, j'ai bien vu
des panneaux sur l'A 86 en passant, mais je n'y ai jamais prété trop
d'attention.
Il me semble me souvenir que c'était aussi un terminus du RER à une époque