elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Funciones, Strings... Unicode. C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Funciones, Strings... Unicode. C++  (Leído 1,841 veces)
Matias Juarez

Desconectado Desconectado

Mensajes: 3



Ver Perfil WWW
Funciones, Strings... Unicode. C++
« en: 29 Noviembre 2016, 02:32 am »

Alguien podrían orientarme un poco, hace poco empece con un curso de c++ por lo que mis conocimientos son semi-nulos.
Estoy usando Code::Blocks y no entiendo como hacer para trabajar con cadenas unicode, me tira errores, en todo, no entiendo como funciona...
Por ejemplo, esta función trabaja correctamente:
Código
  1. MessageBoxA(0, "Texto", "Título", MB_OK | MB_ICONINFORMATION);
Pero esta no!!:
Código
  1. MessageBoxW(0, "Texto", "Título", MB_OK | MB_ICONINFORMATION);
  2. /* MessageBoxW(0, L"Texto", "Título", MB_OK | MB_ICONINFORMATION); */
Mis preguntas mas concretas serían:
1) ¿Por que pasa esto?, ¿cual es el problema?, ¿para que sirve la 'L', por ejemplo: 'L"string"'.
2) ¿como declaro y uso una variable de tipo LPWSTR?
3) ¿por que Code::Blocks usa Ansi por defecto (o tal vez tiene que ver el compilador)?, ¿por que no se muestra el texto que contiene caracteres, por ejemplo, acentuados (hablo del uso de, por ejemplo, con 'cout')?. He intentado usar SetConsoleOutputCP() entre otras cosas, y no parece tener ningún efecto, lo único que me ha servido es usar:
Código
  1. _setmode(_fileno(stdout), 0x20000); // _O_U16TEXT = 0x20000
  2. _setmode(_fileno(stdin), 0x20000); // _O_U16TEXT = 0x20000
Pero parece interferir con otras cosas, no es lo que busco, creo.
4) ¿cual es la diferencia entre wchar_t, char32_t, WCHAR, TCHAR?, ¿cual debo usar?.
5) ¿debo tener en cuenta algo al ejecutar mi programa en otra versión de Windows (sobre este tema)?.
6) ¿como convierto entre una página de códigos a otra?, ¿cual me recomiendan usar y como?.

Gracias!


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Funciones, Strings... Unicode. C++
« Respuesta #1 en: 29 Noviembre 2016, 16:27 pm »

1) ¿Por que pasa esto?, ¿cual es el problema?, ¿para que sirve la 'L', por ejemplo: 'L"string"'.
MessageBoxW requiere wide-chars (wchar_t), al finy  al cabo, es para lo que funciona. Los parámetros deben ser "wide char":
Código
  1. MessageBoxW(0, L"Texto", L"Título", MB_OK | MB_ICONINFORMATION);
Ambos. La 'L' implica que una cadena en vez de ser char*, es wchar_t*.

Interesante ver que el código, para utilizar bien los L"", debe estar en una codificación diferente a ANSI (UTF-8, por ejemplo).


2) ¿como declaro y uso una variable de tipo LPWSTR?
L"texto" es una LPWSTR. wchar_t* o WCHAR*. Son lo mismo.
LPWSTR == Pointer to Wide String
LPCWSTR == Pointer to Constant Wide String

La diferencia entre estos tipos y char es que wchar_t suele ser de mayor tamaño que char. (char -> 1 byte, wchar_t -> 2 bytes)
También existen char16_t y char32_t, como curiosidad.


4) ¿cual es la diferencia entre wchar_t, char32_t, WCHAR, TCHAR?, ¿cual debo usar?.
En caso de querer información sobre un tipo, tienes varias opciones.
Una rápida es forzar un error, y el compilador te suele decir qué tipos son:
Código
  1. TCHAR c = "error";
Código:
error: invalid conversion from 'const char*' to 'TCHAR {aka char}'
Ahí ya nos dice que TCHAR es un char.

Otra opción, dado que son tipos de Windows, es visitar sus referencias:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx
Ahí explica qué es TCHAR:
Código
  1. #ifdef UNICODE
  2.    typedef WCHAR TCHAR;
  3. #else
  4.    typedef char TCHAR;
  5. #endif

Y finalmente, otra:
Código
  1. #include <windows.h>
  2. #include <typeinfo>
  3.  
  4. int main(){
  5. cout << typeid(TCHAR).name() << endl;
  6. }
Ese nombre a veces no es muy descriptivo. Pero puedes comparar nombres. Si 2 nombres son iguales, los tipos son iguales.
Si no te interesa el nombre, puedes hacer una comparación directa:
Código
  1. cout << (typeid(TCHAR) == typeid(char)) << endl;


3) ¿por que Code::Blocks usa Ansi por defecto (o tal vez tiene que ver el compilador)?, ¿por que no se muestra el texto que contiene caracteres, por ejemplo, acentuados (hablo del uso de, por ejemplo, con 'cout')?.

Code::Blocks -> Settings -> Editor -> Other Settings
Ahí elijes codificación.
En el caso de mi compilador, utiliza OEM-850 (u otro parecido, no me fijé)


5) ¿debo tener en cuenta algo al ejecutar mi programa en otra versión de Windows (sobre este tema)?.
En principio no. De existir algún problema, nunca me ha ocurrido.

6) ¿como convierto entre una página de códigos a otra?, ¿cual me recomiendan usar y como?.
Estas dos funciones te pueden ayudar:
MultiByteToWideChar
WideCharToMultiByte


En línea

Matias Juarez

Desconectado Desconectado

Mensajes: 3



Ver Perfil WWW
Re: Funciones, Strings... Unicode. C++
« Respuesta #2 en: 29 Noviembre 2016, 18:25 pm »

Perfecto, gracias ivancea96 me has sacado todas las dudas sobre este tema  ;-) .
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ejecutar funciones dentro de Strings/Lineas
Programación Visual Basic
<--v1c1ous--> 0 1,371 Último mensaje 23 Mayo 2006, 22:27 pm
por <--v1c1ous-->
[Python] Strings a unicode
Scripting
O-LLOS-O 4 4,904 Último mensaje 30 Julio 2010, 21:00 pm
por O-LLOS-O
Funciones PROPIAS para manejo de strings en C/C++ « 1 2 »
Programación C/C++
Álvaro G. Tenorio 12 7,438 Último mensaje 3 Septiembre 2013, 09:44 am
por eferion
Ayuda funciones de strings
Programación C/C++
twiny14 3 2,286 Último mensaje 26 Junio 2014, 04:01 am
por daryo
porque "no es bueno" retornar strings por funciones en C?
Programación C/C++
MRx86 1 1,583 Último mensaje 16 Noviembre 2016, 20:26 pm
por kub0x
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines