C'è un modo standard per fare un fopen con un percorso di file stringa unicode?

StackOverflow https://stackoverflow.com/questions/396567

  •  29-08-2019
  •  | 
  •  

Domanda

C'è un modo standard per fare un fopen con un percorso di file stringa unicode?

È stato utile?

Soluzione

In * nix, è sufficiente utilizzare i fopen standard (vedi ulteriori informazioni in risposta da TokeMacGuy, o in questo forum ) In Windows, è possibile utilizzare _wfopen, e poi passare una stringa unicode (per ulteriori informazioni, vedere MSDN ).

Poiché non esiste un vero e proprio modo comune, vorrei avvolgere questa chiamata in una macro, insieme a tutte le altre funzioni dipendenti dal sistema.

Altri suggerimenti

No, non c'è un modo standard. Ci sono alcune differenze tra i sistemi operativi. Ecco come i diversi sistemi operativi gestire i nomi di file non-ASCII.

Linux

Sotto Linux, un nome di file è semplicemente una stringa binaria. La convenzione sulla maggior parte delle distribuzioni moderne è quello di utilizzare UTF-8 per i nomi di file non-ASCII. Ma in principio, era comune per codificare i nomi di file come ISO-8559-1. E 'in sostanza fino a ciascuna applicazione di scegliere una codifica, in modo da poter anche avere differenti codifiche utilizzate sullo stesso file system. La variabile di ambiente LANG può darvi un suggerimento che cosa la codifica preferito è. Ma in questi giorni, probabilmente si può assumere UTF-8 in tutto il mondo.

Questa non è senza problemi, però, perché un nome di file che contiene una sequenza UTF-8 non valida è perfettamente valido sulla maggior parte dei filesystem Linux. Come si specificare un nome di file come se supporti solo UTF-8? Idealmente, si dovrebbe supportare sia i nomi dei file UTF-8 e binari.

OS X

Il file system HFS su OS X utilizza Unicode (UTF-16) i nomi dei file internamente. La maggior parte C (e POSIX) le funzioni di libreria come fopen accettano stringhe UTF-8 (dato che sono 8-bit compatibile) e li converte internamente.

di Windows

L'API di Windows utilizza UTF-16 per i nomi dei file, ma fopen supporta solo ASCII. Molte funzioni di libreria C hanno un equivalente non standard che accetta UTF-16 (wchar_t su Windows). Ad esempio, _wfopen invece di fopen.

Si tratta di una questione di locale corrente. sul mio sistema, che è unicode abilitato, i percorsi dei file saranno in unicode. Sono in grado di rilevare questo tramite il comando locale:

$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"

La codifica di percorsi di file è normalmente impostata a livello di sistema, quindi se il vostro percorso del file non è nel locale del sistema, sarà necessario convertirlo, forse tramite la iconv biblioteca.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top