OVH Cloud OVH Cloud

stat et wchar_t

18 réponses
Avatar
unbewust
si je cr=E9e "=E0 la main" au terminal, une dir (ou un fichier) contenant
des caract=E8res Unicode et que je fais un stat dessus (depuis C en
castant le path en (char *) =E7a me dit que le fichier n'existe pas.

j'imagine comme en entr=E9e du stat c'est un char * qui est demand=E9, que
les routines de comparaisons de string internes n'utilisent pas les
wchar_t comme wcscmp ???

y aurait'il une lib de "wstat" (stat en wchar_t) ???

ce que je trouve curieux est que le mkdir marche, le touch aussi avec
des caract=E8res Unicode, mais pas le stat, j'en ai eu la confirmation
par un mdls sur les dits rep et/ou fichier...

8 réponses

1 2
Avatar
Eric Levenez
Le 14/08/07 16:37, dans ,
« Pascal Bourguignon » a écrit :

Eric Levenez writes:

Le 14/08/07 15:35, dans <f9sb37$5ai$, « Xavier Roche »
a écrit :

Sous Linux (/Unix), un nom de fichier est une chaîne opaque 8-bit.
Evidemment, cela n'est pas franchement pratique pour gérer des accents,
et historiquement chaque administrateur adoptait un encodage différent
(ISO-8859-1 pour nous, SHIFT_JIS côté soleil levant, etc.) via la locale
du système (man locale)


Sur l'unix Mac OS X, un nom de fichier est une chaîne UTF-8 et pas
uniquement une chaîne "opaque". Le système va donc rejeter toutes séquence
UTF-8 illégale.


Ceci est faux.


Ah, les petites phrases définitives comme Usenet seul sait les créer... :-)

Je dirais même mieux : ceci est faux.

Ce n'est pas sur l'unix MacOSX, c'est sur le file system HFS+.


Non. En interne HFS+ utilise l'UTF-16, et pas l'UTF-8.

Quand on monte un volume qui n'est pas HFS+ sur MacOSX (par exemple,
un volume ext3 sur Linux via NFS), on y trouve des séquences d'octets
qui ne sont pas des encodage utf-8 valide, et que MacOSX gère
parfaitement comme tout bon système POSIX.


Cela est fait par une couche d'adaptation en dessous qui traduit l'UTF-8 en
ce qui va bien pour le système de fichiers.

Pour créer des accents dans un fichier, par exemple sur une partition FAT-32
(qui utilise de l'UTF-16 en interne), et bien on utilise la seule interface
disponible sur Mac OS X : l'UTF-8. C'est le système de fichier FAT de Mac OS
X qui va faire la conversion en ce qui va bien.

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



Avatar
Pascal Bourguignon
Xavier Roche writes:

Sur l'unix Mac OS X, un nom de fichier est une chaîne UTF-8 et pas
uniquement une chaîne "opaque". Le système va donc rejeter toutes séquence
UTF-8 illégale.


Un open() avec une chaîne invalide renvoi donc un code d'erreur ?


Seulement le fichier en question se trouve sur un volume HFS+.

Note que on peut avoir des situations rigolotes:

/Volumes/nfs-1/wild/mount-point-for-remote-hfs+/mnt/mount-point-for-remote-ext3/wild

Un volume NFS contenant un file system ext3 est monté sur un volume
HFS+. Dans ce volume NFS on monte un volume HFS+, et dans ce dernier
encore un autre volume ext3. Une séquence d'octet invalide pour UTF-8
peut être rejetée, mais uniquement quand elle fait parti d'un nom qui
doit être résolu sur un volume HFS+.

/Volumes/nfs-1/wild/mount-point-for-remote-hfs+/mnt/mount-point-for-remote-ext3/wild
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^

Les octets indiqués par ^^ pourraient contenir une séquence invalide
pour UTF-8, et cependant on peut atteindre le fichier dénoté. Enfin,
à condition que le programme ne soit pas idiot, et n'essaye pas de
tester lui-même la validité de la séquence d'octet (c'est à dire,
qu'il n'utilise pas une chaine unicode pour manipuler les chemins
POSIX).

--
__Pascal Bourguignon__ http://www.informatimago.com/

NOTE: The most fundamental particles in this product are held
together by a "gluing" force about which little is currently known
and whose adhesive power can therefore not be permanently
guaranteed.


Avatar
Pascal Bourguignon
Eric Levenez writes:

Le 14/08/07 16:37, dans ,
« Pascal Bourguignon » a écrit :

Eric Levenez writes:

Le 14/08/07 15:35, dans <f9sb37$5ai$, « Xavier Roche »
a écrit :

Sous Linux (/Unix), un nom de fichier est une chaîne opaque 8-bit.
Evidemment, cela n'est pas franchement pratique pour gérer des accents,
et historiquement chaque administrateur adoptait un encodage différent
(ISO-8859-1 pour nous, SHIFT_JIS côté soleil levant, etc.) via la locale
du système (man locale)


Sur l'unix Mac OS X, un nom de fichier est une chaîne UTF-8 et pas
uniquement une chaîne "opaque". Le système va donc rejeter toutes séquence
UTF-8 illégale.


Ceci est faux.


Ah, les petites phrases définitives comme Usenet seul sait les créer... :-)

Je dirais même mieux : ceci est faux.

Ce n'est pas sur l'unix MacOSX, c'est sur le file system HFS+.


Non. En interne HFS+ utilise l'UTF-16, et pas l'UTF-8.

Quand on monte un volume qui n'est pas HFS+ sur MacOSX (par exemple,
un volume ext3 sur Linux via NFS), on y trouve des séquences d'octets
qui ne sont pas des encodage utf-8 valide, et que MacOSX gère
parfaitement comme tout bon système POSIX.


Cela est fait par une couche d'adaptation en dessous qui traduit l'UTF-8 en
ce qui va bien pour le système de fichiers.

Pour créer des accents dans un fichier, par exemple sur une partition FAT-32
(qui utilise de l'UTF-16 en interne), et bien on utilise la seule interface
disponible sur Mac OS X : l'UTF-8. C'est le système de fichier FAT de Mac OS
X qui va faire la conversion en ce qui va bien.


Essaye le! Tu peux écrire un petit programme unix, tu le verras bien!
open(2) prend une séquence d'octet sur MacOSX comme sur tout système
POSIX. La façon dont cette séquence d'octet est interprétée depends
seulement de POSIX et des file systems par lesquels on passe. En
l'occurence, si on a monté un volume ext3 ou NFS, on a droit à toutes
les combinaisons octets (hormis 0 et 47).

Sur MacOSX, comme sur tout système unix, il n'y a qu'une seule
interface: le syscall open(2), et celui ci prend une séquence d'octet.



--
__Pascal Bourguignon__ http://www.informatimago.com/

NOTE: The most fundamental particles in this product are held
together by a "gluing" force about which little is currently known
and whose adhesive power can therefore not be permanently
guaranteed.




Avatar
Pascal Bourguignon
unbewust writes:

[...]
LC_CTYPE=fr_FR.UTF-8


OK, merci, c'est exactement ce que j'ai par défaut sur ma bécanne...
[...]
mon source est aussi en UTF-8


Ok, alors peut être que le problème est une question de normalisation
unicode. Peut être que l'éditeur n'utilise pas la même normalisation,
et il faut alors le faire explicitement dans le programme C.

http://developer.apple.com/qa/qa2001/qa1235.html

--
__Pascal Bourguignon__ http://www.informatimago.com/

NOTE: The most fundamental particles in this product are held
together by a "gluing" force about which little is currently known
and whose adhesive power can therefore not be permanently
guaranteed.


Avatar
Eric Levenez
Le 14/08/07 19:35, dans ,
« Pascal Bourguignon » a écrit :

Eric Levenez writes:

Pour créer des accents dans un fichier, par exemple sur une partition FAT-32
(qui utilise de l'UTF-16 en interne), et bien on utilise la seule interface
disponible sur Mac OS X : l'UTF-8. C'est le système de fichier FAT de Mac OS
X qui va faire la conversion en ce qui va bien.


Essaye le!


C'est déjà fait, bien sûr. Errno 22.

Tu peux écrire un petit programme unix, tu le verras bien!


J'ai testé et cela marche comme je l'ai dit.

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


Avatar
Pascal Bourguignon
Eric Levenez writes:

Le 14/08/07 19:35, dans ,
« Pascal Bourguignon » a écrit :

Eric Levenez writes:

Pour créer des accents dans un fichier, par exemple sur une partition FAT-32
(qui utilise de l'UTF-16 en interne), et bien on utilise la seule interface
disponible sur Mac OS X : l'UTF-8. C'est le système de fichier FAT de Mac OS
X qui va faire la conversion en ce qui va bien.


Essaye le!


C'est déjà fait, bien sûr. Errno 22.

Tu peux écrire un petit programme unix, tu le verras bien!


J'ai testé et cela marche comme je l'ai dit.


Alors on ne doit pas avoir le même MacOSX.
--
__Pascal Bourguignon__ http://www.informatimago.com/

NOTE: The most fundamental particles in this product are held
together by a "gluing" force about which little is currently known
and whose adhesive power can therefore not be permanently
guaranteed.



Avatar
Antoine Leca
En news:,
unbewust va escriure:
si je crée "à la main" au terminal, une dir (ou un fichier) contenant
des caractères Unicode et que je fais un stat dessus (depuis C en
castant le path en (char *) ça me dit que le fichier n'existe pas.


Essaye opendir() and co., ou fnmatch(), pour obtenir le «vrai» nom du
fichier.

j'imagine comme en entrée du stat c'est un char * qui est demandé, que
les routines de comparaisons de string internes n'utilisent pas les
wchar_t comme wcscmp ???


stat(2) est un appel système (parfois enrobé dans une très fine couche),
donc les routines internes en question sont celles du noyau.
Qui n'ont que peu de chances d'être wcscmp(3).


y aurait'il une lib de "wstat" (stat en wchar_t) ???


Peut-être sur ta bécane. Chez moi, non (OS=Minix). Ici, oui (OS=NT;
s'appelle _wstat(), de fait).


ce que je trouve curieux est que le mkdir marche, le touch aussi avec
des caractères Unicode, mais pas le stat, j'en ai eu la confirmation
par un mdls sur les dits rep et/ou fichier...


touch() n'est pas à ma connaissance une fonction C normalisée ou même
répandue, j'ai idée que l'on mélange des choses qui n'ont pas grand'chose à
voir entre elles.


Antoine

Avatar
Antoine Leca
<HS>
In news:C2E7A137.B00C5%, Eric Levenez va escriure:
Pour créer des accents dans un fichier, par exemple sur une partition
FAT-32 (qui utilise de l'UTF-16 en interne), et bien on utilise la
seule interface disponible sur Mac OS X : l'UTF-8. C'est le système
de fichier FAT de Mac OS X qui va faire la conversion en ce qui va
bien.


Pour continuer dans la catégorie « Usenet fait mal aux drosophiles », FAT-32
en tant que tel n'utilise pas UTF-16, c'est l'extension « VFAT » qui le fait
(sur n'importe quel volume FAT, d'ailleurs).
La preuve, tu peux monter un volume FAT-32 avec MS-DOS 7.1 ou DR-DOS 7.03+,
et les seuls noms de fichiers disponibles seront en page de code «OEM», au
format 8.3

Il y avait [y a encore ?] la même subtile distinction pour les options de
montage de Linux.
Apparement, MacOS X a tout regroupé sous le seul nom de FAT. À raison.
</HS>


Antoine

1 2