2012-01-12 10 views
18

¿Es posible usar las funciones ANSI de API de Windows con cadenas UTF-8?Funciones API ANSI de Windows y UTF-8

Por ejemplo, supongamos que tengo una ruta codificada en UTF-8. ¿Puedo llamar al CreateDirectoryA o CreateFileA y usar una ruta UTF-8, o debo realizar alguna conversión antes de llamar a las funciones?

+2

Huy. ¿Por qué alguien querría eso? Creo que ya hemos superado Windows ME (que fue la última versión de Windows que necesitó las API de ANSI). Deben desaparecer ya, especialmente para aplicaciones recientemente desarrolladas. – Joey

+1

¿De dónde obtiene las cadenas UTF-8? Es mucho más fácil convertir la aplicación para que funcione completamente con cadenas UTF-16, como requieren las denominadas funciones de API de Windows de amplia versión. Y como dice Joey, * siempre * llame a las versiones anchas (con el sufijo 'W'), no a las versiones ANSI. Esos han sido obsoletos durante décadas. –

+4

@Joey: Porque una gran cantidad de bibliotecas C (++) (¡incluida la biblioteca estándar!) Prefieren trabajar con cadenas basadas en 'char' en lugar de cadenas basadas en' wchar_t'. Si Windows es totalmente compatible con UTF-8, entonces puede usar UTF-8 en su programa en lugar de tener que realizar conversiones entre UTF-8 y UTF-16 todo el tiempo. – dan04

Respuesta

15

No. Utilice MultiByteToWideChar para convertir UTF-8 a UTF-16 y luego llame a las API de caracteres anchos como CreateDirectoryW o CreateFileW.

+0

Maldita sea, tenía miedo de eso ... :(Gah ... Será mejor que comience con eso entonces ... – krebstar

+12

También agregaría que, dado que Windows usa exclusivamente UTF-16, podría ser mejor que lo siguieras y trabajases con UTF -16 en su mayor parte, y solo realiza la conversión a UTF-8 cuando necesite leer/escribir desde fuentes externas. – casablanca

+4

@casablanca: Otro enfoque que se ha recomendado es usar UTF-8 en su mayor parte y convertirlo a de UTF-16 solo cuando hablas con la interfaz de Windows. –

3

Un enfoque más sencillo (que el uso de la API de Win32 prima MultiByteToWideChar) sería utilizar ATL conversion helpers, como CA2CW. Puede especificar CP_UTF8 como página de códigos (segundo parámetro en el constructor), convertir de Unicode UTF-8 a Unicode UTF-16:

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

Tenga en cuenta que en Unicode se basa (que debería ser la falta de pago éstas día), CreateDirectory simplemente se expande a CreateDirectoryW, por lo que me acaba de caer la terminación "W" y usar el (en mi humilde opinión, más legible) CreateDirectory:

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