Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

129
Views
Aceptar caracteres no ASCII

Considere este programa:

 #include <stdio.h> int main(int argc, char* argv[]) { printf("%s\n", argv[1]); return 0; }

Lo compilo así:

 x86_64-w64-mingw32-gcc -o alpha alpha.c

El problema es si le doy un argumento no ASCII:

 $ ./alpha róisín r�is�n

¿Cómo puedo escribir y/o compilar este programa de manera que acepte caracteres que no sean ASCII? Para responder a alk : no, el programa está imprimiendo mal. Mira este ejemplo:

 $ echo Ω | od -t x1c 0000000 ce a9 0a 316 251 \n 0000003 $ ./alpha Ω | od -t x1c 0000000 4f 0d 0a O \r \n 0000003
over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

La forma más fácil de hacer esto es con wmain :

 #include <fcntl.h> #include <stdio.h> int wmain (int argc, wchar_t** argv) { _setmode(_fileno(stdout), _O_WTEXT); wprintf(L"%s\n", argv[1]); return 0; }

También se puede hacer con GetCommandLineW ; aquí hay una versión simple del código que se encuentra en el repositorio de HandBrake :

 #include <stdio.h> #include <windows.h> int get_argv_utf8(int* argc_ptr, char*** argv_ptr) { int argc; char** argv; wchar_t** argv_utf16 = CommandLineToArgvW(GetCommandLineW(), &argc); int i; int offset = (argc + 1) * sizeof(char*); int size = offset; for (i = 0; i < argc; i++) size += WideCharToMultiByte(CP_UTF8, 0, argv_utf16[i], -1, 0, 0, 0, 0); argv = malloc(size); for (i = 0; i < argc; i++) { argv[i] = (char*) argv + offset; offset += WideCharToMultiByte(CP_UTF8, 0, argv_utf16[i], -1, argv[i], size-offset, 0, 0); } *argc_ptr = argc; *argv_ptr = argv; return 0; } int main(int argc, char** argv) { get_argv_utf8(&argc, &argv); printf("%s\n", argv[1]); return 0; }
over 4 years ago · Santiago Trujillo Report

0

Dado que está utilizando MinGW (en realidad MinGW-w64, pero eso no debería importar en este caso), tiene acceso a la API de Windows, por lo que lo siguiente debería funcionar para usted. Probablemente podría ser más limpio y realmente probado correctamente, pero al menos debería proporcionar una buena idea:

 #define _WIN32_WINNT 0x0600 #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <wchar.h> #include <windows.h> int main (void) { int argc; int i; LPWSTR *argv; argv = CommandLineToArgvW(GetCommandLineW(), &argc); if (argv == NULL) { FormatMessageA( ( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS), NULL, GetLastError(), 0, (LPWSTR)&error, 0, NULL); fprintf(stderr, error); fprintf(stderr, "\n"); LocalFree(error); return EXIT_FAILURE; } for (i = 0; i < argc; ++i) wprintf(L"argv[%d]: %ls\n", i, argv[i]); // You must free argv using LocalFree! LocalFree(argv); return 0; }

Tenga en cuenta este problema: Windows no compondrá sus cadenas por usted. Yo uso mi propio diseño de teclado de Windows que combina caracteres (soy raro), así que cuando escribo

 example -o àlf

en mi símbolo del sistema de Windows, obtengo el siguiente resultado:

 argv[0]: example argv[1]: -o argv[2]: a\u0300lf

El a\u0300 es U+0061 (LATIN SMALL LETTER A) seguido de una representación del punto de código Unicode U+0300 (COMBINING GRAVE ACCENT) . Si en cambio uso

 example -o àlf

que usa el carácter precompuesto U+00E0 (LATIN SMALL LETTER A WITH GRAVE) , la salida habría sido diferente:

 argv[0]: example argv[1]: -o argv[2]: \u00E0lf

donde \u00E0 es una representación del carácter precompuesto à representado por el punto de código Unicode U+00E0. Sin embargo, si bien puedo ser una persona extraña por hacer esto, la página de códigos vietnamita 1258 en realidad incluye la combinación de caracteres. Normalmente, esto no debería afectar el manejo de nombres de archivo, pero puede haber algunas dificultades.

Para los argumentos que son solo cadenas, es posible que desee ver la normalización con la función NormalizeString . La documentación y los ejemplos vinculados deberían ayudarlo a comprender cómo funciona la función. La normalización y algunas otras cosas en Unicode pueden ser un viaje largo, pero si este tipo de cosas te emocionan, también es un viaje divertido.

over 4 years ago · Santiago Trujillo Report

0

Intenta compilar y ejecutar el siguiente programa:

 #include <stdio.h> int main() { int i = 0; for( i=0; i<256; i++){ printf("\nASCII Character #%d:%c ", i, i); } printf("\n"); return 0; }

En su salida, debería ver esos pequeños signos de interrogación desde el número 128 en adelante. Para su información, estoy usando Ubuntu, y cuando compilo y ejecuto este programa (con GNOME Terminal), esto también me sucede.

Sin embargo, si voy a Terminal > Establecer codificación de caracteres... y selecciono Western (WINDOWS-1252) en lugar de Unicode (UTF-8), y vuelvo a ejecutar el programa, los caracteres ASCII extendidos se muestran correctamente.

No sé los pasos exactos para Windows/MinGW , pero, en resumen, cambiar la codificación de caracteres debería solucionar su problema .

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!