Comment ouvrir un fichier avec wchar_t* contenant des caractères non Ascii chaîne dans Linux?
Environnement: Gcc/G++ Linux
J'ai un non-ascii fichier du système de fichiers et je vais ouvrir.
Maintenant, j'ai un wchar_t*, mais je ne sais pas comment l'ouvrir. (ma confiance fopen ouvre uniquement char* fichier)
S'il vous plaît aider. Merci beaucoup.
Est le nom de fichier non ASCII, ou le contenu de la non-ASCII, ou les deux?
Oui, les deux. Il y a wfstream pour lire/écrire des wchar dans un fichier, mais wfstream s'ouvre également à seulement char* fichier.
Convertir wchar à utf8 char et essayer de fopen ()?
Oui, les deux. Il y a wfstream pour lire/écrire des wchar dans un fichier, mais wfstream s'ouvre également à seulement char* fichier.
Convertir wchar à utf8 char et essayer de fopen ()?
OriginalL'auteur Cauly | 2011-01-13
Vous devez vous connecter pour publier un commentaire.
Il y a deux réponses possibles:
Si vous voulez vous assurer que tous les noms de fichiers Unicode sont représentable, vous pouvez coder en dur l'hypothèse que le système de fichiers utilise UTF-8 dans les noms de fichiers. C'est le "moderne" de Linux de bureau-application de l'approche. Il suffit de convertir vos chaînes de
wchar_t
(UTF-32) de l'UTF-8 avec les fonctions de la bibliothèque (iconv
serait bien travailler) ou de votre propre mise en œuvre (mais recherche les spécifications afin de ne pas le faire horriblement mal, comme Shelwien n'), puis utilisezfopen
.Si vous voulez faire les choses le plus de normes orientées de façon, vous devez utiliser
wcsrtombs
pour convertir lewchar_t
chaîne multi-octetschar
chaîne dans les paramètres régionaux de l'encodage (qui je l'espère est de l'UTF-8 de toute façon sur tout système moderne) et l'utilisationfopen
. Notez que cette fonction nécessite que vous avez préalablement défini les paramètres régionaux avecsetlocale(LC_CTYPE, "")
ousetlocale(LC_ALL, "")
.Et enfin, pas exactement une réponse, mais une recommandation:
Stocker des noms de fichier comme
wchar_t
chaînes est probablement une erreur horrible. En revanche, vous pouvez stocker des noms abstraits chaînes d'octets, et seulement convertirwchar_t
juste-à-temps pour les afficher dans l'interface utilisateur (si c'est encore nécessaire pour que; de nombreuses boîtes à outils d'INTERFACE utilisateur utilisation de la plaine chaînes d'octets eux-mêmes et ne l'interprétation des caractères pour vous). De cette façon, vous éliminez beaucoup de méchant coin des cas, et jamais vous vous trouvez dans une situation où certains fichiers sont inaccessibles à cause de leurs noms.OriginalL'auteur R..
Linux n'est pas en UTF-8, mais c'est votre seul choix pour les noms de fichiers de toute façon
(Fichiers pouvez avoir tout ce que vous voulez à l'intérieur de.)
À l'égard de noms de fichiers, linux n'est pas vraiment un codage de la chaîne de s'inquiéter. Les noms de fichiers sont des chaînes d'octets qui doivent être null.
Ce n'est pas précisément dire que Linux est UTF-8, mais cela signifie qu'il n'est pas compatible avec des caractères larges, car ils pourraient avoir un zéro dans un octet qui n'est pas la fin de l'octet.
Mais UTF-8 préserve la non-null-sauf à la fin, donc je crois que l'approche pratique est "convertir en UTF-8" pour les noms de fichiers.
Le contenu des fichiers est une question pour les normes ci-dessus le noyau Linux, donc ici il n'y a pas quelque chose de Linux-y que vous pouvez ou voulez faire. Le contenu de fichiers seront concernent uniquement les programmes en cours de lecture et d'écriture. Linux seulement les magasins et renvoie le flux d'octets, et il peut avoir tous les incorporés nuls vous le souhaitez.
Il ne devrait pas être frustrant. C'est en fait le plus simple possible. Simplement utiliser de l'UTF-8 partout et vous n'avez rien à craindre.
linux respecte la philosophie Unix (le plus simple). utf8everywhere.org
OriginalL'auteur DigitalRoss
Convertir wchar chaîne utf8 chaîne de char, puis utiliser fopen.
Je vous remercie et j'ai résolu mon problème. Le seul problème, c'est que sous Linux wchar_t est égal à uint32. J'ai fait quelques modifications et il a travaillé.
Les fonctions de cette réponse sont horriblement de la non-conforme et dangereux. Recherche les définitions correctes de l'UTF-8 et UTF-16 si vous voulez les utiliser. (Et notez que UTF-16 est hors de propos pour des OP question depuis
wchar_t
est pas en UTF-16, sauf sur Windows, et même là, c'est plutôt cassé...)OriginalL'auteur Shelwien
Découvrez ce document
http://www.firstobject.com/wchar_t-string-on-linux-osx-windows.htm
Je pense que Linux suit norme POSIX, qui traite de tous les noms de fichier en UTF-8.
OriginalL'auteur Peon the Great
Je le prends c'est le nom du fichier qui contient des caractères non-ascii, et non le fichier lui-même, quand vous dites "non-ascii fichier dans le système de fichiers". Il n'importe pas vraiment ce que contient le fichier.
Vous pouvez le faire avec la normale fopen, mais vous aurez à correspondre à l'encodage du système de fichiers utilise.
Il dépend de la version de Linux et quel système de fichiers que vous utilisez et comment vous avez mis en place, mais probablement, si vous avez de la chance, le système de fichiers utilise UTF-8. Alors, prenez votre wchar_t (qui est probablement une codé en UTF-16 string?), convertir une chaine de caractères encodés en UTF-8, et le passer à fopen.
OriginalL'auteur metamatt
OriginalL'auteur Tanzer