Bonjour,
Pourquoi le constructeur de std::wifstream prend un char const* et
pas
un wchat_t const* ?
C'est une bonne question et une defficience de la norme C++ AMHA. Il
Comment faire pour ouvrir un fichier dont le nom
comporte des charactères unicodes (Chinois par exemple) ?
Utiliser l'API native du système pour ouvrir le fichier puis
Bonjour,
Pourquoi le constructeur de std::wifstream prend un char const* et
pas
un wchat_t const* ?
C'est une bonne question et une defficience de la norme C++ AMHA. Il
Comment faire pour ouvrir un fichier dont le nom
comporte des charactères unicodes (Chinois par exemple) ?
Utiliser l'API native du système pour ouvrir le fichier puis
Bonjour,
Pourquoi le constructeur de std::wifstream prend un char const* et
pas
un wchat_t const* ?
C'est une bonne question et une defficience de la norme C++ AMHA. Il
Comment faire pour ouvrir un fichier dont le nom
comporte des charactères unicodes (Chinois par exemple) ?
Utiliser l'API native du système pour ouvrir le fichier puis
Sylvain Togni wrote:Comment faire pour ouvrir un fichier dont le nom
comporte des charactères unicodes (Chinois par exemple) ?
Utiliser l'API native du système pour ouvrir le fichier puis
construire ton stream par dessus, ou bien utiliser boost::filesystem
qui prend en charge ses aspects.
Sylvain Togni wrote:
Comment faire pour ouvrir un fichier dont le nom
comporte des charactères unicodes (Chinois par exemple) ?
Utiliser l'API native du système pour ouvrir le fichier puis
construire ton stream par dessus, ou bien utiliser boost::filesystem
qui prend en charge ses aspects.
Sylvain Togni wrote:Comment faire pour ouvrir un fichier dont le nom
comporte des charactères unicodes (Chinois par exemple) ?
Utiliser l'API native du système pour ouvrir le fichier puis
construire ton stream par dessus, ou bien utiliser boost::filesystem
qui prend en charge ses aspects.
Bonjour,
Pourquoi le constructeur de std::wifstream prend un char const* et pas
un wchat_t const* ?
Comment faire pour ouvrir un fichier dont le nom
comporte des charactères unicodes (Chinois par exemple) ?
Bonjour,
Pourquoi le constructeur de std::wifstream prend un char const* et pas
un wchat_t const* ?
Comment faire pour ouvrir un fichier dont le nom
comporte des charactères unicodes (Chinois par exemple) ?
Bonjour,
Pourquoi le constructeur de std::wifstream prend un char const* et pas
un wchat_t const* ?
Comment faire pour ouvrir un fichier dont le nom
comporte des charactères unicodes (Chinois par exemple) ?
Bonjour,
Pourquoi le constructeur de std::wifstream prend un char const* et pas
un wchat_t const* ?
Comment faire pour ouvrir un fichier dont le nom
comporte des charactères unicodes (Chinois par exemple) ?
Bonjour,
Pourquoi le constructeur de std::wifstream prend un char const* et pas
un wchat_t const* ?
Comment faire pour ouvrir un fichier dont le nom
comporte des charactères unicodes (Chinois par exemple) ?
Bonjour,
Pourquoi le constructeur de std::wifstream prend un char const* et pas
un wchat_t const* ?
Comment faire pour ouvrir un fichier dont le nom
comporte des charactères unicodes (Chinois par exemple) ?
Bonjour,
Pourquoi le constructeur de std::wifstream prend un char
const* et pas un wchat_t const* ?
Comment faire pour ouvrir un fichier dont le nom comporte
des charactères unicodes (Chinois par exemple) ?
Bonjour,
Pourquoi le constructeur de std::wifstream prend un char
const* et pas un wchat_t const* ?
Comment faire pour ouvrir un fichier dont le nom comporte
des charactères unicodes (Chinois par exemple) ?
Bonjour,
Pourquoi le constructeur de std::wifstream prend un char
const* et pas un wchat_t const* ?
Comment faire pour ouvrir un fichier dont le nom comporte
des charactères unicodes (Chinois par exemple) ?
J'ai récemment fait un petit programme qui parcourait toute une
arborescence de répertoires sous Windows en utilisant boost::filesystem,
et cela échouait systématiquement quand il rencontrait des fichiers ou
des répertoires dont le nom n'était pas représentable par des chars.
J'ai récemment fait un petit programme qui parcourait toute une
arborescence de répertoires sous Windows en utilisant boost::filesystem,
et cela échouait systématiquement quand il rencontrait des fichiers ou
des répertoires dont le nom n'était pas représentable par des chars.
J'ai récemment fait un petit programme qui parcourait toute une
arborescence de répertoires sous Windows en utilisant boost::filesystem,
et cela échouait systématiquement quand il rencontrait des fichiers ou
des répertoires dont le nom n'était pas représentable par des chars.
Sylvain Togni wrote:
Pourquoi le constructeur de std::wifstream prend un char
const* et pas un wchat_t const* ?
C'est une bonne question et une defficience de la norme C++
AMHA. Il faut reconnaitre cependant que le problème n'est pas
simple : les différents encodages, sur les différentes
localisations des différents OS, rend l'écriture d'une
solution portable assez complexe.
Comment faire pour ouvrir un fichier dont le nom comporte des
charactères unicodes (Chinois par exemple) ?
Utiliser l'API native du système pour ouvrir le fichier puis
construire ton stream par dessus, ou bien utiliser
boost::filesystem qui prend en charge ses aspects.
Sylvain Togni wrote:
Pourquoi le constructeur de std::wifstream prend un char
const* et pas un wchat_t const* ?
C'est une bonne question et une defficience de la norme C++
AMHA. Il faut reconnaitre cependant que le problème n'est pas
simple : les différents encodages, sur les différentes
localisations des différents OS, rend l'écriture d'une
solution portable assez complexe.
Comment faire pour ouvrir un fichier dont le nom comporte des
charactères unicodes (Chinois par exemple) ?
Utiliser l'API native du système pour ouvrir le fichier puis
construire ton stream par dessus, ou bien utiliser
boost::filesystem qui prend en charge ses aspects.
Sylvain Togni wrote:
Pourquoi le constructeur de std::wifstream prend un char
const* et pas un wchat_t const* ?
C'est une bonne question et une defficience de la norme C++
AMHA. Il faut reconnaitre cependant que le problème n'est pas
simple : les différents encodages, sur les différentes
localisations des différents OS, rend l'écriture d'une
solution portable assez complexe.
Comment faire pour ouvrir un fichier dont le nom comporte des
charactères unicodes (Chinois par exemple) ?
Utiliser l'API native du système pour ouvrir le fichier puis
construire ton stream par dessus, ou bien utiliser
boost::filesystem qui prend en charge ses aspects.
le Tuesday 19 April 2005 12:41, écrivit :
Pourquoi le constructeur de std::wifstream prend un char
const* et pas un wchat_t const* ?
le contenu du fichier peut utiliser un encoding indépendamment
du codage des noms de fichiers dans le filesystem. Ceci dit,
si on s'occupe d'un wifstream, on est à priori en situation
"internationalisée", et les noms de fichiers ont des chances
de l'être aussi, c'est vrai.
j'imagine que le standard a pris en compte les plateformes où
les noms de fichiers sont juste des séquences d'octets (privés
de valeurs interdites), et ne voulaient pas forcer à
implémenter un open(wchar_t const*) sur toutes les
plateformes.
Une telle fonction ne pourrait pas être bien faite à moins que
la plateforme ne fournisse ce qu'il faut. (l'implémenteur de
la SL aurait du mal à obtenir les caractéristiques du
filesystem où repose le fichier, ses paramètres de montage
etc, pour convertir un wchar* en char* de manière utile. la
plateforme le pourrait éventuellement) Il y a peut être une
fonction de l'API windows pour ça, mais sous linux je ne crois
pas.
Comment faire pour ouvrir un fichier dont le nom comporte des
charactères unicodes (Chinois par exemple) ?
même par le biais de paramètres char*, il devrait être
possible d'ouvrir n'importe quel fichier : le tout est de
trouver la bonne séquence de caractères..
Si le programme qui a créé le fichier est le même que celui
qui ouvre, il suffit de choisir un mapping
unicode -> séquences de caractères
et s'y tenir. (en évitant tout caractère problematique pour le
filesystem..) a priori, on utiliserait UTF-8 pour ça.
Le VFAT, par exemple, n'a pas d'encoding "standard" des noms
de fichiers dépassant le cadre d'un des 'codepages' - 256
caractères au plus, (contrairement aux filesystems plus
récents), et dans ce cas il est difficile de deviner le bon
mapping..
j'avais testé, avec WinXP sur du VFAT, les noms de fichiers
codés en UTF-8 sont bien interpretés (l'explorer les affiche
correctement, on peut rennommer, etc..).
pour le vfat sous linux, les paramètres de montage permettent
de choisir la conversions entre l'encoding du filesystem
(option "codepage") et celui de l'API filesystem linux (option
"iocharset", latin1 par défaut) J'obtiens un bonne
compatibilité avec windowsXP en montant les partitions vfat
avec les options :
utf8,codepage 0
(iocharset est laissé à latin1 par défaut, mettre UTF-8 comme
charset est déconseillé à cause de problèmes obscures de
minuscules/majuscules de noms de fichiers.. à la place il faut
mettre l'option utf8)
En gros :
-si la plateforme n'a pas vraiment de concept de charset et
consièdre juste des noms de fichiers comme des char*
"binaires", un open(wchar *) n'a pas de sens, mais on peut
convertir soi-même un wchar* en char* (e.g. en UTF-8)
-si la plateforme a une API filesystem qui supporte les wchar,
soit on l'utilise, soit on convertit un wchar* en char* qu'on
utilisera avec la S.L. Avec un peu de chance, on peut espérer
obtenir le même résultat. (mais on peut imaginer que l'inverse
se produise : que via l'interface char* on ne puisse accèder
qu'à une sous-partie des noms de fichiers valides ..)
le Tuesday 19 April 2005 12:41, écrivit :
Pourquoi le constructeur de std::wifstream prend un char
const* et pas un wchat_t const* ?
le contenu du fichier peut utiliser un encoding indépendamment
du codage des noms de fichiers dans le filesystem. Ceci dit,
si on s'occupe d'un wifstream, on est à priori en situation
"internationalisée", et les noms de fichiers ont des chances
de l'être aussi, c'est vrai.
j'imagine que le standard a pris en compte les plateformes où
les noms de fichiers sont juste des séquences d'octets (privés
de valeurs interdites), et ne voulaient pas forcer à
implémenter un open(wchar_t const*) sur toutes les
plateformes.
Une telle fonction ne pourrait pas être bien faite à moins que
la plateforme ne fournisse ce qu'il faut. (l'implémenteur de
la SL aurait du mal à obtenir les caractéristiques du
filesystem où repose le fichier, ses paramètres de montage
etc, pour convertir un wchar* en char* de manière utile. la
plateforme le pourrait éventuellement) Il y a peut être une
fonction de l'API windows pour ça, mais sous linux je ne crois
pas.
Comment faire pour ouvrir un fichier dont le nom comporte des
charactères unicodes (Chinois par exemple) ?
même par le biais de paramètres char*, il devrait être
possible d'ouvrir n'importe quel fichier : le tout est de
trouver la bonne séquence de caractères..
Si le programme qui a créé le fichier est le même que celui
qui ouvre, il suffit de choisir un mapping
unicode -> séquences de caractères
et s'y tenir. (en évitant tout caractère problematique pour le
filesystem..) a priori, on utiliserait UTF-8 pour ça.
Le VFAT, par exemple, n'a pas d'encoding "standard" des noms
de fichiers dépassant le cadre d'un des 'codepages' - 256
caractères au plus, (contrairement aux filesystems plus
récents), et dans ce cas il est difficile de deviner le bon
mapping..
j'avais testé, avec WinXP sur du VFAT, les noms de fichiers
codés en UTF-8 sont bien interpretés (l'explorer les affiche
correctement, on peut rennommer, etc..).
pour le vfat sous linux, les paramètres de montage permettent
de choisir la conversions entre l'encoding du filesystem
(option "codepage") et celui de l'API filesystem linux (option
"iocharset", latin1 par défaut) J'obtiens un bonne
compatibilité avec windowsXP en montant les partitions vfat
avec les options :
utf8,codepage 0
(iocharset est laissé à latin1 par défaut, mettre UTF-8 comme
charset est déconseillé à cause de problèmes obscures de
minuscules/majuscules de noms de fichiers.. à la place il faut
mettre l'option utf8)
En gros :
-si la plateforme n'a pas vraiment de concept de charset et
consièdre juste des noms de fichiers comme des char*
"binaires", un open(wchar *) n'a pas de sens, mais on peut
convertir soi-même un wchar* en char* (e.g. en UTF-8)
-si la plateforme a une API filesystem qui supporte les wchar,
soit on l'utilise, soit on convertit un wchar* en char* qu'on
utilisera avec la S.L. Avec un peu de chance, on peut espérer
obtenir le même résultat. (mais on peut imaginer que l'inverse
se produise : que via l'interface char* on ne puisse accèder
qu'à une sous-partie des noms de fichiers valides ..)
le Tuesday 19 April 2005 12:41, écrivit :
Pourquoi le constructeur de std::wifstream prend un char
const* et pas un wchat_t const* ?
le contenu du fichier peut utiliser un encoding indépendamment
du codage des noms de fichiers dans le filesystem. Ceci dit,
si on s'occupe d'un wifstream, on est à priori en situation
"internationalisée", et les noms de fichiers ont des chances
de l'être aussi, c'est vrai.
j'imagine que le standard a pris en compte les plateformes où
les noms de fichiers sont juste des séquences d'octets (privés
de valeurs interdites), et ne voulaient pas forcer à
implémenter un open(wchar_t const*) sur toutes les
plateformes.
Une telle fonction ne pourrait pas être bien faite à moins que
la plateforme ne fournisse ce qu'il faut. (l'implémenteur de
la SL aurait du mal à obtenir les caractéristiques du
filesystem où repose le fichier, ses paramètres de montage
etc, pour convertir un wchar* en char* de manière utile. la
plateforme le pourrait éventuellement) Il y a peut être une
fonction de l'API windows pour ça, mais sous linux je ne crois
pas.
Comment faire pour ouvrir un fichier dont le nom comporte des
charactères unicodes (Chinois par exemple) ?
même par le biais de paramètres char*, il devrait être
possible d'ouvrir n'importe quel fichier : le tout est de
trouver la bonne séquence de caractères..
Si le programme qui a créé le fichier est le même que celui
qui ouvre, il suffit de choisir un mapping
unicode -> séquences de caractères
et s'y tenir. (en évitant tout caractère problematique pour le
filesystem..) a priori, on utiliserait UTF-8 pour ça.
Le VFAT, par exemple, n'a pas d'encoding "standard" des noms
de fichiers dépassant le cadre d'un des 'codepages' - 256
caractères au plus, (contrairement aux filesystems plus
récents), et dans ce cas il est difficile de deviner le bon
mapping..
j'avais testé, avec WinXP sur du VFAT, les noms de fichiers
codés en UTF-8 sont bien interpretés (l'explorer les affiche
correctement, on peut rennommer, etc..).
pour le vfat sous linux, les paramètres de montage permettent
de choisir la conversions entre l'encoding du filesystem
(option "codepage") et celui de l'API filesystem linux (option
"iocharset", latin1 par défaut) J'obtiens un bonne
compatibilité avec windowsXP en montant les partitions vfat
avec les options :
utf8,codepage 0
(iocharset est laissé à latin1 par défaut, mettre UTF-8 comme
charset est déconseillé à cause de problèmes obscures de
minuscules/majuscules de noms de fichiers.. à la place il faut
mettre l'option utf8)
En gros :
-si la plateforme n'a pas vraiment de concept de charset et
consièdre juste des noms de fichiers comme des char*
"binaires", un open(wchar *) n'a pas de sens, mais on peut
convertir soi-même un wchar* en char* (e.g. en UTF-8)
-si la plateforme a une API filesystem qui supporte les wchar,
soit on l'utilise, soit on convertit un wchar* en char* qu'on
utilisera avec la S.L. Avec un peu de chance, on peut espérer
obtenir le même résultat. (mais on peut imaginer que l'inverse
se produise : que via l'interface char* on ne puisse accèder
qu'à une sous-partie des noms de fichiers valides ..)
je ne connais pas
assez Windows pour savoir si c'est le cas ou non.
je ne connais pas
assez Windows pour savoir si c'est le cas ou non.
je ne connais pas
assez Windows pour savoir si c'est le cas ou non.
En fait, sous Windows, il y a un truc intéressant : tout fichier a un
nom "normal" (celui affiché par l'explorateur) et un nom "court"
(celui vu par les programmes en 16 bits). Ce nom court ne contient
généralement que des caractères ASCII (de 33 à 127).
Exemple : le fichier "Arrête tes conneries.txt" a pour nom court
ARRTET~1.TXT.
En fait, sous Windows, il y a un truc intéressant : tout fichier a un
nom "normal" (celui affiché par l'explorateur) et un nom "court"
(celui vu par les programmes en 16 bits). Ce nom court ne contient
généralement que des caractères ASCII (de 33 à 127).
Exemple : le fichier "Arrête tes conneries.txt" a pour nom court
ARRTET~1.TXT.
En fait, sous Windows, il y a un truc intéressant : tout fichier a un
nom "normal" (celui affiché par l'explorateur) et un nom "court"
(celui vu par les programmes en 16 bits). Ce nom court ne contient
généralement que des caractères ASCII (de 33 à 127).
Exemple : le fichier "Arrête tes conneries.txt" a pour nom court
ARRTET~1.TXT.