2012-01-12 6 views
18

È possibile utilizzare le funzioni ANSI dell'API di Windows con le stringhe UTF-8?Funzioni ANSI API di Windows e UTF-8

Ad esempio, supponiamo di avere un percorso codificato in UTF-8. Posso chiamare CreateDirectoryA o CreateFileA e utilizzare un percorso UTF-8 o devo eseguire qualche conversione prima di chiamare le funzioni?

+2

Yikes. Perché qualcuno dovrebbe volerlo? Penso che ora siamo passati a Windows ME (che era l'ultima versione di Windows che avesse mai bisogno delle API ANSI). Dovrebbero estinguersi già, soprattutto per le applicazioni di nuova concezione. – Joey

+1

Da dove ottieni le stringhe UTF-8? È molto più semplice convertire la tua applicazione in modo che funzioni interamente con le stringhe UTF-16, come richiedono le cosiddette funzioni API di Windows di versioni ampie. E come dice Joey, * sempre * chiama le versioni wide (con il suffisso 'W'), non le versioni ANSI. Quelli sono stati obsoleti per decenni. –

+4

@Joey: Perché un sacco di librerie C (++) (inclusa la libreria standard!) Preferiscono lavorare con le stringhe basate su 'char' piuttosto che sulle stringhe basate su' wchar_t'. Se Windows supporta pienamente UTF-8, puoi utilizzare UTF-8 in tutto il programma invece di dover eseguire la conversione tra UTF-8 e UTF-16 in ogni momento. – dan04

risposta

15

No. Utilizzare MultiByteToWideChar per convertire UTF-8 in UTF-16 e quindi chiamare le API a carattere esteso come CreateDirectoryW o CreateFileW.

+0

Accidenti, avevo paura di quello .. :(Gah .. Meglio iniziare su quello allora .. – krebstar

+12

Vorrei anche aggiungere che poiché Windows usa esclusivamente UTF-16, potrebbe essere meglio per voi seguire l'esempio e lavorare con UTF -16 per la maggior parte, e solo effettuare la conversione in UTF-8 quando è necessario leggere/scrivere da fonti esterne – casablanca

+4

@casablanca: Un altro approccio che è stato sostenuto è quello di utilizzare UTF-8 per la maggior parte e convertire in e da UTF-16 solo quando si parla con l'interfaccia di Windows. –

3

Un approccio più semplice (che utilizzare grezzo Win32 API MultiByteToWideChar) sarebbe utilizzare ATL conversion helpers, come CA2CW. È possibile specificare CP_UTF8 come pagina di codice (secondo parametro nel costruttore), convertire da Unicode UTF-8 a Unicode UTF-16:

CreateDirectoryW( 
    CA2W(utf8Name, CP_UTF8) // convert from UTF-8 to UTF-16 
    ... // other stuff 
); 

Si noti che in Unicode costruisce (che dovrebbe essere quelli di default questi giorni), CreateDirectory espande solo per CreateDirectoryW, quindi vorrei solo cadere il finale "W" e utilizzare il (secondo me, più leggibile) CreateDirectory:

CreateDirectory( 
    CA2W(utf8Name, CP_UTF8) // convert from UTF-8 to UTF-16 
    ... // other stuff 
);