gpt4 book ai didi

c - 接受非 ASCII 字符

转载 作者:可可西里 更新时间:2023-11-01 14:13:36 26 4
gpt4 key购买 nike

考虑这个程序:

#include <stdio.h>

int main(int argc, char* argv[]) {
printf("%s\n", argv[1]);
return 0;
}

我是这样编译的:

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

问题是如果我给它一个非 ASCII 参数:

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

我如何编写和/或编译这个程序,使其接受非 ASCII人物?回应alk : 不,程序打印错误。看这个例子:

$ echo Ω | od -t x1c
0000000 ce a9 0a
316 251 \n
0000003

$ ./alpha Ω | od -t x1c
0000000 4f 0d 0a
O \r \n
0000003

最佳答案

最简单的方法是使用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;
}

也可以用GetCommandLineW来完成;这是代码的简单版本在 HandBrake repo 找到:

#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;
}

关于c - 接受非 ASCII 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30832756/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com