【发布时间】:2015-08-30 05:11:03
【问题描述】:
考虑这个程序:
#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
【问题讨论】:
-
这取决于 MinGW 为创建
argv数组所做的工作。它是否使用 UTF-8 或 ANSI 对命令行进行编码?如果是ANSI,那么你应该检查MinGW是否支持wmain使用wchar_t *参数。否则,只需忽略陈旧的 ANSI 字符串(IMO,现在整个 ANSI API 都是毫无价值的垃圾,因此经常导致 mojibake)并调用CommandLineToArgvW并通过WideCharToMultiByte手动编码为 UTF-8,如果您需要char *字符串。 -
您的更新证明 MinGW 正在调用
GetCommandLineA以获取 ANSI 编码的命令行副本,因此您得到 mojibake "Ω" => "O",因为这是您的最接近的映射ANSI 字符集(可能是 1252)用于希腊语 Omega 字符。这是毫无价值的。使用GetCommandLineW、CommandLineToArgvW和WideCharToMultibyte获取 UTF-8 编码的命令行参数。
标签: c windows argv non-ascii-characters