Je viens de commencer à travailler sur la programmation pour gérer les noms de fichiers avec des noms non anglais sur un système WinXP. J'ai lu quelques recommandations sur l'unicode et je pense avoir saisi l'idée de base, mais certaines parties ne sont pas très claires pour moi.
Plus précisément, dans quel encodage (UTF-8, UTF-16LE/BE) les noms de fichiers (pas le contenu, mais le nom réel du fichier) sont-ils stockés dans NTFS? Est-il possible d'ouvrir n'importe quel fichier en utilisant fopen(), qui prend un char*, ou n'ai-je pas d'autre choix que d'utiliser wfopen(), qui utilise un wchar_t*, et qui prend probablement une chaîne UTF-16?
J'ai essayé d'introduire manuellement une chaîne encodée en UTF-8 à fopen(), par exemple.
unsigned char filename[] = {0xEA, 0xB0, 0x80, 0x2E, 0x74, 0x78, 0x74, 0x0}; // .txt
FILE* f = fopen((char*)filename, "wb+");
mais cela est sorti comme '.txt'.
J'étais sous l'impression (qui peut être fausse) qu'une chaîne encodée en UTF8 serait suffisante pour ouvrir n'importe quel nom de fichier sous Windows, car je me souviens vaguement qu'une application Windows passait autour de (char*), pas de (wchar_t*), et qu'il n'y avait pas de problèmes.
Est-ce que quelqu'un peut éclairer ma lanterne à ce sujet?
0 votes
Le comportement de PHP a changé à partir de PHP 7.1, voir stackoverflow.com/a/38466772/680382
0 votes
"J'avais l'impression (qui peut être fausse) qu'une chaîne encodée en UTF-8 suffirait pour ouvrir n'importe quel fichier sous Windows" - Windows NE prend PAS en charge les noms de fichiers encodés en UTF-8, seulement UTF-16 et ANSI (qui est converti en interne en UTF-16). Les noms de fichiers UTF-8 contenant uniquement des caractères ASCII fonctionneront comme des chaînes ANSI, cependant. "Je me souviens vaguement qu'une application Windows passait des (char), pas des (wchar_t), et qu'il n'y avait aucun problème" -
char*
n'implique pas l'UTF-8, mais peut être utilisé pour cela. Aucune API standard Win32 ou C/C++ de fichiers n'accepte l'UTF-8 en entrée, mais des bibliothèques tierces peuvent le faire.