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

path en Unicode et stat...

30 réponses
Avatar
unbewust
si je cr=E9e un dossier avec des caract=E8res Unicode :

$> mkdir =E9t=E9

ou :

$> touch =E9t=E9.txt

si je fais un mdls l=E0-dessus, pas de pb, j'imagine que c'est Apple qui
a con=E7u le mdls (?)


le mdls confirme que touch et mkdir "passent" avec des caract=E8res
unicode

mdls affiche d'ailleurs de deux maniers ce path :

=E9t=E9 ou "e' te' "

par contre si je fais un stat dessus, stat trouve que le r=E9pertoire
comme le fichier n'existent pas, j'imagine que c'est du =E0 une
comparaison interne (???) bien s=FBr pour passer l'argument du path je
suis obliger, avec stat de faire un cast (char *) (au lieu d'avoir
wchar_t)


donc ma question, est-ce qu'il existe des fonctions telles que stat
and Co en wchar_t ??? comme il existe des fonctions pour les strings
en multi-bytes.

10 réponses

1 2 3
Avatar
Eric Levenez
Le 14/08/07 15:08, dans
, « unbewust »
a écrit :

si je crée un dossier avec des caractères Unicode :

$> mkdir été

ou :

$> touch été.txt

si je fais un mdls là-dessus, pas de pb, j'imagine que c'est Apple qui
a conçu le mdls (?)


le mdls confirme que touch et mkdir "passent" avec des caractères
unicode

mdls affiche d'ailleurs de deux maniers ce path :

été ou "e' te' "

par contre si je fais un stat dessus, stat trouve que le répertoire
comme le fichier n'existent pas, j'imagine que c'est du à une
comparaison interne (???) bien sûr pour passer l'argument du path je
suis obliger, avec stat de faire un cast (char *) (au lieu d'avoir
wchar_t)


Et tu crois qu'un cast d'un pointeur va changer un encodage Unicode UTF-16
en un encodage ASCII ou autre ?

Comme répondu dans fclc il faut que tu utilises l'UTF-8 pour encoder le nom
du fichier et donc ne pas utiliser les wchar_t.

donc ma question, est-ce qu'il existe des fonctions telles que stat
and Co en wchar_t ??? comme il existe des fonctions pour les strings
en multi-bytes.


Mauvais questions :-) Il suffit d'utiliser toutes les fonctions
traditionnelles mais en utilisant l'UTF-8.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
unbewust
On 14 août, 16:28, Eric Levenez wrote:
Le 14/08/07 15:08, dans
, « unbewust »



si je crée un dossier avec des caractères Unicode :

$> mkdir été

ou :

$> touch été.txt

si je fais un mdls là-dessus, pas de pb, j'imagine que c'est Apple qui
a conçu le mdls (?)

le mdls confirme que touch et mkdir "passent" avec des caractères
unicode

mdls affiche d'ailleurs de deux maniers ce path :

été ou "e' te' "

par contre si je fais un stat dessus, stat trouve que le répertoire
comme le fichier n'existent pas, j'imagine que c'est du à une
comparaison interne (???) bien sûr pour passer l'argument du path je
suis obliger, avec stat de faire un cast (char *) (au lieu d'avoir
wchar_t)


Et tu crois qu'un cast d'un pointeur va changer un encodage Unicode UTF-16
en un encodage ASCII ou autre ?


ah non pas du tout...


Comme répondu dans fclc il faut que tu utilises l'UTF-8 pour encoder le nom
du fichier et donc ne pas utiliser les wchar_t.


AH, alors là, je ne pige pas, comment ça se débrouille, mais tant
mieux, c'est plus simple.


donc ma question, est-ce qu'il existe des fonctions telles que stat
and Co en wchar_t ??? comme il existe des fonctions pour les strings
en multi-bytes.


Mauvais questions :-) Il suffit d'utiliser toutes les fonctions
traditionnelles mais en utilisant l'UTF-8.


tant mieux mais le seul truc que je ne vois pas c'est comment les
comparaisons se font...


Avatar
Eric Levenez
Le 14/08/07 17:35, dans
, « unbewust »
a écrit :

On 14 août, 16:28, Eric Levenez wrote:
Le 14/08/07 15:08, dans
, « unbewust »

donc ma question, est-ce qu'il existe des fonctions telles que stat
and Co en wchar_t ??? comme il existe des fonctions pour les strings
en multi-bytes.


Mauvais questions :-) Il suffit d'utiliser toutes les fonctions
traditionnelles mais en utilisant l'UTF-8.


tant mieux mais le seul truc que je ne vois pas c'est comment les
comparaisons se font...


Là c'est plus compliqué. En effet en UTF-8 un même caractère peut être
encodé de plusieurs manières (type et ordre des caractères d'échappement).
Pour comparer 2 chaînes Unicode Mac OS X normalise les 2 chaînes (pour qu'un
caractère soit toujours codé de la même manière), et c'est seulement après
que la comparaison est faite.

<http://en.wikipedia.org/wiki/Unicode_normalization>. Je crois me rappeler
qu'Apple utilise le NFD.

Le système de fichier HFS+ de Mac OS X utilise en interne l'UTF-16. Ainsi
quand on demande d'ouvrir le ficher "éric.txt", l'UTF-8 de la chaîne du open
est normalisée et comparé à l'UTF-16 interne déjà normalisé.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.



Avatar
unbewust
On 14 août, 18:23, Eric Levenez wrote:
Le 14/08/07 17:35, dans
, « unbewust »

On 14 août, 16:28, Eric Levenez wrote:
Le 14/08/07 15:08, dans
, « unbewust »

donc ma question, est-ce qu'il existe des fonctions telles que stat
and Co en wchar_t ??? comme il existe des fonctions pour les strings
en multi-bytes.


Mauvais questions :-) Il suffit d'utiliser toutes les fonctions
traditionnelles mais en utilisant l'UTF-8.


tant mieux mais le seul truc que je ne vois pas c'est comment les
comparaisons se font...


Là c'est plus compliqué. En effet en UTF-8 un même caractère peut être
encodé de plusieurs manières (type et ordre des caractères d'écha ppement).
Pour comparer 2 chaînes Unicode Mac OS X normalise les 2 chaînes (pou r qu'un
caractère soit toujours codé de la même manière), et c'est seulem ent après
que la comparaison est faite.

<http://en.wikipedia.org/wiki/Unicode_normalization>. Je crois me rappeler
qu'Apple utilise le NFD.

Le système de fichier HFS+ de Mac OS X utilise en interne l'UTF-16. Ain si
quand on demande d'ouvrir le ficher "éric.txt", l'UTF-8 de la chaîne du open
est normalisée et comparé à l'UTF-16 interne déjà normalisé.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.




oui, oui, je suis d'accord, je pense que la norme unix en ce qui
concerne l'encodage (d'après ce que j'ai lu) est UTF-8 et évite
effectivement certains pbs liés au codages multiple d'autant qu'aucun
multi-byte ne peut commence par un "0" (fin de chaine en C)

donc oui, ça doit pouvoir se faire, je vais vérifier ça en n'utilisant
plus les wchar_t et regarder si stat (plutôt lstat d'ailleurs) mais
dit oui ou non que mon fichier "été.txt" existe bien...

mdls (sans doute une fonction écrite par Apple) se débriouille très
bien avec ça en tout cas.


mais déjà sur Terminal comme sur iTerm l'UTF-8 n'est pas correctement
représenté,

dans terminal j'ai "e??te??.txt" et dans iTerm j'ai "e##te##.txt"
quand je fais un ls -al sur le rep en question...


mais ce n'est peut-être pas le même pb...

A+

Yvon




Avatar
Eric Levenez
Le 14/08/07 18:32, dans
, « unbewust »
a écrit :


oui, oui, je suis d'accord, je pense que la norme unix en ce qui
concerne l'encodage (d'après ce que j'ai lu) est UTF-8


Je ne pense pas. Lors de la certification Unix (passée par Leopard), le
fournisseur donne liste des encodage qu'il utilise. Je ne pense pas que quoi
que ce soit ne soit imposé.

et évite
effectivement certains pbs liés au codages multiple d'autant qu'aucun
multi-byte ne peut commence par un "0" (fin de chaine en C)


L'UTF-8 est très bien pour sa compatibilité mais pose énormément de
problèmes pour les séquences mal formées, qui, si elles ne sont pas bien
traitées, peuvent entraîner des plantages applicatifs, et donc des trous de
sécurité. Apple a corrigé depuis la sortie de Mac OS X 10.0 beaucoup de
problèmes là dessus.

donc oui, ça doit pouvoir se faire, je vais vérifier ça en n'utilisant
plus les wchar_t et regarder si stat (plutôt lstat d'ailleurs) mais
dit oui ou non que mon fichier "été.txt" existe bien...

mdls (sans doute une fonction écrite par Apple) se débriouille très
bien avec ça en tout cas.


mdls est bien sûr l'oeuvre d'Apple car cette commande repose sur les
technologies Apple.

mais déjà sur Terminal comme sur iTerm l'UTF-8 n'est pas correctement
représenté,


Mais si, aucun problème avec Terminal. Aucune idée avec iTerm.

dans terminal j'ai "e??te??.txt" et dans iTerm j'ai "e##te##.txt"
quand je fais un ls -al sur le rep en question...


Un petit "man ls" t'aurait expliqué le problème : il faut faire "ls -wal"
pour que "ls" n'interprète pas les caractères non ASCII. Il faut aussi
laisser l'encodage de Terminal en UTF-8 bien sûr.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
Vincent Lefevre
Dans l'article <C2E7AB56.B00E5%,
Eric Levenez écrit:

Le 14/08/07 18:32, dans
, « unbewust »
a écrit :
[...]

dans terminal j'ai "e??te??.txt" et dans iTerm j'ai "e##te##.txt"
quand je fais un ls -al sur le rep en question...


Un petit "man ls" t'aurait expliqué le problème : il faut faire "ls -wal"
pour que "ls" n'interprète pas les caractères non ASCII. Il faut aussi
laisser l'encodage de Terminal en UTF-8 bien sûr.


Il vaut mieux utiliser un ls non buggé (e.g. celui des coreutils)
qu'une option (-w) posant des problèmes de sécurité.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


Avatar
Eric Levenez
Le 15/08/07 4:03, dans <20070815020216$, « Vincent
Lefevre » <vincent+ a écrit :

Il vaut mieux utiliser un ls non buggé (e.g. celui des coreutils)
qu'une option (-w) posant des problèmes de sécurité.


Le "ls" de Mac OS X n'est pas buggé, l'option -w est voulue. Et le problème
de sécurité sur l'exécution de code est vraiment limite et existe sur tout
les ls en mode raw.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
Patrick Stadelmann
In article <20070815020216$,
Vincent Lefevre <vincent+ wrote:

qu'une option (-w) posant des problèmes de sécurité.


C'est à dire ?

Patrick
--
Patrick Stadelmann

Avatar
unbewust
On 14 août, 18:56, Eric Levenez wrote:

Un petit "man ls" t'aurait expliqué le problème : il faut faire "ls - wal"
pour que "ls" n'interprète pas les caractères non ASCII. Il faut aussi
laisser l'encodage de Terminal en UTF-8 bien sûr.



OK, c'est bon, en fait lstat marche trè bien sur de l'UTF-8 pourvu
qu'on ne passe pas en wchar_t...


merci, A+

Yvon

Avatar
unbewust
On 15 août, 04:03, Vincent Lefevre <vincent+ wrote:

Il vaut mieux utiliser un ls non buggé (e.g. celui des coreutils)
qu'une option (-w) posant des problèmes de sécurité.



c'est lequel celui-là ???

car je viens de m'apercevoir que le ls que j'utilise ne correspond pas
à celui du man...

sans doute le MAN_PATh n'est pas dans le même ordre que le PATH...

1 2 3