Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme avec les locales

7 réponses
Avatar
Denis Joiret
Bonjour,

J'ai un problème avec la fonction POSIX strftime et la localisation.
J'aimerais afficher la date en anglais, mais je n'y arrive pas, bien que je
modifie dans mon script l'environnement au travers de la variable %ENV pour
dupprimer la variable d'environnement "LANG".

Voici le script :

#!/usr/local/bin/perl5 -w

BEGIN {
delete $ENV{"LANG"};
}

use POSIX qw{strftime};

sub rfc822date() {
strftime("%a, %e %b %Y %T", localtime(time));
}

print rfc822date(), "\n";

La variable LANG est positionnée à "fr" dans mon environnement :
% echo $LANG
fr

Si je lance l'exécution, voici ce que j'obtiens :
% perl rfc822date.pl
mar, 4 mai 2004 10:05:25

Pourtant, la ligne delete dans le block BEGIN devrait supprimer la variable
LANG le temps de l'exécution du programme. Si je supprime en dehors du
script cette variable, j'obtins le résultat voulu :
% unsetenv LANG
% perl ~/rfc822date.pl
Tue, 4 May 2004 10:05:41


Comment obtenir ce résultat sans modifier mon environnement à l'extérieur du
script ? Si quelqu'un a une idée, je suis preneur.

Denis Joiret

7 réponses

Avatar
Denis Joiret
J'ai trouvé. Il suffit de rajouter un appel à setlocale en positionnant
LC_ALL à "". Voici le script modifié et qui fonctionne cette fois:

#!/usr/local/bin/perl5 -w
use POSIX qw{:locale_h};
use POSIX qw{strftime};

sub rfc822date() {
strftime("%a, %e %b %Y %T", localtime(time));
}

delete $ENV{"LANG"};
setlocale(LC_ALL, "");
print rfc822date(), "n";


"Denis Joiret" a écrit dans le message de
news:c77jcv$7r3$
Bonjour,

J'ai un problème avec la fonction POSIX strftime et la localisation.
J'aimerais afficher la date en anglais, mais je n'y arrive pas, bien que
je

modifie dans mon script l'environnement au travers de la variable %ENV
pour

dupprimer la variable d'environnement "LANG".

Voici le script :

#!/usr/local/bin/perl5 -w

BEGIN {
delete $ENV{"LANG"};
}

use POSIX qw{strftime};

sub rfc822date() {
strftime("%a, %e %b %Y %T", localtime(time));
}

print rfc822date(), "n";

La variable LANG est positionnée à "fr" dans mon environnement :
% echo $LANG
fr

Si je lance l'exécution, voici ce que j'obtiens :
% perl rfc822date.pl
mar, 4 mai 2004 10:05:25

Pourtant, la ligne delete dans le block BEGIN devrait supprimer la
variable

LANG le temps de l'exécution du programme. Si je supprime en dehors du
script cette variable, j'obtins le résultat voulu :
% unsetenv LANG
% perl ~/rfc822date.pl
Tue, 4 May 2004 10:05:41


Comment obtenir ce résultat sans modifier mon environnement à l'extérieur
du

script ? Si quelqu'un a une idée, je suis preneur.

Denis Joiret




Avatar
FDA
Denis Joiret wrote:

J'ai trouvé. Il suffit de rajouter un appel à setlocale en positionnant
LC_ALL à "". Voici le script modifié et qui fonctionne cette fois:

#!/usr/local/bin/perl5 -w
use POSIX qw{:locale_h};
use POSIX qw{strftime};

sub rfc822date() {


Pas de "use locale;" ?

Avatar
Denis Joiret
Bonjour,

De ce que je comprends, "use locale;" est un pragma qui sert à faire prendre
en compte la localisation pour les opérateurs build-in de perl, comme sort,
gt, lt, etc. Ici pour mon besoin, il s'agit d'appeler une fonction externe
de perl (strftime) via le module POSIX, je ne pense donc pas que cela puisse
servir. En plus, ce que je veux est justement ne pas utiliser la
localisation, donc cela serait plutôt "no locale;" que "use locale;".

De toutes façon, quelle que soit la forme utilisée, cela ne fonctionne pas :

% cat rfc822date-bis.pl
#!/usr/local/bin/perl5 -w
use POSIX qw{strftime};

sub rfc822date() {
strftime("%a, %e %b %Y %T", localtime(time));
}

no locale;
print rfc822date(), "n";
use locale;
print rfc822date(), "n";

% perl ~/rfc822date-bis.pl
jeu, 6 mai 2004 16:31:27
jeu, 6 mai 2004 16:31:27
%

Denis

"FDA" a écrit dans le message de
news:4098a9e4$0$11486$
Denis Joiret wrote:

J'ai trouvé. Il suffit de rajouter un appel à setlocale en positionnant
LC_ALL à "". Voici le script modifié et qui fonctionne cette fois:

#!/usr/local/bin/perl5 -w
use POSIX qw{:locale_h};
use POSIX qw{strftime};

sub rfc822date() {


Pas de "use locale;" ?



Avatar
Scetbon Cyril
Et pourquoi $ENV{LC_ALL}="" ne fonctionne pas ?
quelqu'un a une explication ?
je pensais que celà modifier la variable d'environnement durant le
script et que c'était pris en compte par les commandes suivantes.

Denis Joiret wrote:
J'ai trouvé. Il suffit de rajouter un appel à setlocale en positionnant
LC_ALL à "". Voici le script modifié et qui fonctionne cette fois:

#!/usr/local/bin/perl5 -w
use POSIX qw{:locale_h};
use POSIX qw{strftime};

sub rfc822date() {
strftime("%a, %e %b %Y %T", localtime(time));
}

delete $ENV{"LANG"};
setlocale(LC_ALL, "");
print rfc822date(), "n";


"Denis Joiret" a écrit dans le message de
news:c77jcv$7r3$

Bonjour,

J'ai un problème avec la fonction POSIX strftime et la localisation.
J'aimerais afficher la date en anglais, mais je n'y arrive pas, bien que


je

modifie dans mon script l'environnement au travers de la variable %ENV


pour

dupprimer la variable d'environnement "LANG".

Voici le script :

#!/usr/local/bin/perl5 -w

BEGIN {
delete $ENV{"LANG"};
}

use POSIX qw{strftime};

sub rfc822date() {
strftime("%a, %e %b %Y %T", localtime(time));
}

print rfc822date(), "n";

La variable LANG est positionnée à "fr" dans mon environnement :
% echo $LANG
fr

Si je lance l'exécution, voici ce que j'obtiens :
% perl rfc822date.pl
mar, 4 mai 2004 10:05:25

Pourtant, la ligne delete dans le block BEGIN devrait supprimer la


variable

LANG le temps de l'exécution du programme. Si je supprime en dehors du
script cette variable, j'obtins le résultat voulu :
% unsetenv LANG
% perl ~/rfc822date.pl
Tue, 4 May 2004 10:05:41


Comment obtenir ce résultat sans modifier mon environnement à l'extérieur


du

script ? Si quelqu'un a une idée, je suis preneur.

Denis Joiret









Avatar
Jack
Bonjour,

rfc1766 pourrait-elle t'aider?

Jack

Le 04/05/2004 10:14, :
Bonjour,

J'ai un problème avec la fonction POSIX strftime et la localisation.
J'aimerais afficher la date en anglais, mais je n'y arrive pas, bien que je
modifie dans mon script l'environnement au travers de la variable %ENV pour
dupprimer la variable d'environnement "LANG".

Voici le script :

#!/usr/local/bin/perl5 -w

BEGIN {
delete $ENV{"LANG"};
}

use POSIX qw{strftime};

sub rfc822date() {
strftime("%a, %e %b %Y %T", localtime(time));
}

print rfc822date(), "n";

La variable LANG est positionnée à "fr" dans mon environnement :
% echo $LANG
fr

Si je lance l'exécution, voici ce que j'obtiens :
% perl rfc822date.pl
mar, 4 mai 2004 10:05:25

Pourtant, la ligne delete dans le block BEGIN devrait supprimer la variable
LANG le temps de l'exécution du programme. Si je supprime en dehors du
script cette variable, j'obtins le résultat voulu :
% unsetenv LANG
% perl ~/rfc822date.pl
Tue, 4 May 2004 10:05:41


Comment obtenir ce résultat sans modifier mon environnement à l'extérieur du
script ? Si quelqu'un a une idée, je suis preneur.

Denis Joiret




Avatar
Denis Joiret
Bonjour,

Pas vraiment, cette rfc décrit la manière d'informer sur le langage utilisé
(ex: "fr" => langue française)

Mon problème n'est pas un problème de définition des valeurs, mais un
problème de manipulation spécifique à l'implémentation sous Un*x.

Je n'ai pas compris pourquoi on ne peut pas agir en modifiant seulement les
variables d'environnement liées au locale (LANG, LC_*), c'est pourtant bien
ce que la documentation standard indique (man 3 locale)

Petite précision: si j'avais mis dans un block BEGIN la ligne "delete
$ENV{LANG}", c'est pour que la destruction de la variable soit effective au
moment du "use POSIX qw{strftime}". Cela ne suffit cependant pas, et créer
une variable "LC_ALL" ne règle pas non plus le problème. Seule la methode
avec "setlocale" fonctionne correctement, et encore uniquement si je
supprime également la variable "LANG", ce qui est contraire à ce qu'indique
la page de manuel de la fonction "setlocale(3)" et "locale(7)" qui précise
que "LC_ALL" prévaut sur le reste, notamment sur "LANG".

Denis

"Jack" a écrit dans le message de
news:c7g168$
Bonjour,

rfc1766 pourrait-elle t'aider?

Jack




Avatar
Jack
Bonjour,


Il est utile de préciser l'OS, car certains systèmes ne supportent pas
le formatage. La rfc1766 permet d'aménager dans certains langages (ex:
php) la compatibilité Unix et Windows, l'utilisation de setlocale en
conjonction avec strftime est alors nécessaire. C'est ce qui se passe
ailleurs mais dans perl?


Bon courage
JacK


Le 10/05/2004 09:22, :
Bonjour,

Pas vraiment, cette rfc décrit la manière d'informer sur le langage utilisé
(ex: "fr" => langue française)

Mon problème n'est pas un problème de définition des valeurs, mais un
problème de manipulation spécifique à l'implémentation sous Un*x.

Je n'ai pas compris pourquoi on ne peut pas agir en modifiant seulement les
variables d'environnement liées au locale (LANG, LC_*), c'est pourtant bien
ce que la documentation standard indique (man 3 locale)

Petite précision: si j'avais mis dans un block BEGIN la ligne "delete
$ENV{LANG}", c'est pour que la destruction de la variable soit effective au
moment du "use POSIX qw{strftime}". Cela ne suffit cependant pas, et créer
une variable "LC_ALL" ne règle pas non plus le problème. Seule la methode
avec "setlocale" fonctionne correctement, et encore uniquement si je
supprime également la variable "LANG", ce qui est contraire à ce qu'indique
la page de manuel de la fonction "setlocale(3)" et "locale(7)" qui précise
que "LC_ALL" prévaut sur le reste, notamment sur "LANG".

Denis

"Jack" a écrit dans le message de
news:c7g168$

Bonjour,

rfc1766 pourrait-elle t'aider?

Jack