2010-04-02 3 views
1

J'ai une application qui a été développée sous Windows, mais pour gcc. Le code est principalement indépendant du système d'exploitation, avec très peu de classes spécifiques à Windows car un port Linux a toujours été considéré comme nécessaire. L'API, en particulier celle qui est appelée comme résultat direct de l'interaction de l'utilisateur, utilise des tableaux de caractères larges au lieu des tableaux char (en note, je ne peux pas changer l'API elle-même - à ce stade, std :: wstring Ne peut pas être utilisé). Ceux-ci sont considérés comme codés en UTF-16.wopen appels lors du portage vers Linux

À certains endroits, le code ouvre des fichiers, principalement en utilisant l'appel de fonction _wopen spécifique à Windows. Le problème avec ceci est qu'il n'y a pas de substitut à Linux pour wopen car Linux "ne traite que des octets".

La question est: comment puis-je porter ce code? Que se passe-t-il si je veux ouvrir un fichier avec le nom "something ™ .log", comment pourrais-je le faire sous Linux? Est-ce qu'un cast à char * suffisant, les caractères larges seraient ramassés automatiquement en fonction des paramètres régionaux (probablement pas)? Ai-je besoin de convertir manuellement? Je suis un peu confus à ce sujet, peut-être quelqu'un pourrait me diriger vers une documentation à ce sujet.

Répondre

1

La stratégie que j'ai adoptée sur Mac dépend du fait que Mac OS X utilise utf-8 dans tout son fichier io POSIX api.

J'ai donc créé un type "fschar" qui est un char dans les constructions Windows non Unicode, wchar_t dans les constructions UNICODE de Windows et char (encore) lors de la construction pour Mac OS. Je passe toutes les chaînes du système de fichiers en utilisant ce type. Les littéraux de chaîne sont codés avec des wrappers (TEXT ("literal")) pour obtenir le codage correct - tous mes fichiers de données stockent des caractères utf-8 sur le disque que, sur les builds UNICODE, I MultiByteToWideChar convertit en utf16.

0

Linux ne prend pas en charge les noms de fichiers UTF16. Il supporte cependant les fichiers UTF8 et ceux-ci peuvent être ouverts en utilisant le fopen().
Ce que vous devez faire est de convertir des chaînes larges en UTF8.

Questions connexes