Cmd 如何将Unicode参数传递给G++;? 我试图用G++来编译一个简单的C++程序。我正在运行Windows 10,并且已经安装了MinGW。因此,我试图用G++通过在命令提示符中键入G++“C:\Users\Vesk\Desktop\crmkфаааааа\Hello World.cpp”来编译这个文件C:\Users\Vesk\Desktop\crmkфааааа\Hello World.exe”。G++虽然没有编译该文件,但给了我以下错误消息: g++: error: C:\Users\Vesk\Desktop\???????????\Hello World.cpp: Invalid argument g++: fatal error: no input files compilation terminated.

Cmd 如何将Unicode参数传递给G++;? 我试图用G++来编译一个简单的C++程序。我正在运行Windows 10,并且已经安装了MinGW。因此,我试图用G++通过在命令提示符中键入G++“C:\Users\Vesk\Desktop\crmkфаааааа\Hello World.cpp”来编译这个文件C:\Users\Vesk\Desktop\crmkфааааа\Hello World.exe”。G++虽然没有编译该文件,但给了我以下错误消息: g++: error: C:\Users\Vesk\Desktop\???????????\Hello World.cpp: Invalid argument g++: fatal error: no input files compilation terminated.,cmd,unicode,character-encoding,g++,mingw,Cmd,Unicode,Character Encoding,G++,Mingw,“аааааааааааа”只是一个用西里尔文写的单词,所以我不知道问题出在哪里。但后来我将“ааафааааааа”文件夹重命名为“信息学”。我试图用g++“C:\Users\Vesk\Desktop\informatic\Hello World.cpp”-o“C:\Users\Vesk\Desktop\informatic\Hello World.exe”再次编译该文件。你瞧,它起作用了。G++编译了该文件,可执行文件在文件夹中并正在运行。但是,如果文件路径包含西里尔字母(或其他Unicod

“аааааааааааа”只是一个用西里尔文写的单词,所以我不知道问题出在哪里。但后来我将“ааафааааааа”文件夹重命名为“信息学”。我试图用
g++“C:\Users\Vesk\Desktop\informatic\Hello World.cpp”-o“C:\Users\Vesk\Desktop\informatic\Hello World.exe”
再次编译该文件。你瞧,它起作用了。G++编译了该文件,可执行文件在文件夹中并正在运行。但是,如果文件路径包含西里尔字母(或其他Unicode)字符,是否有任何方法可以实际编译文件?如果是,如何使用?

Windows将UTF-16用于Unicode文件名。据我所知,它不支持UTF-8作为区域设置,尽管这将非常有用

我尝试了一个非常旧的MinGW G++4.6.3,实际上它不支持当前语言环境之外的文件路径中的Unicode字符。不知道最近的MinGW GCC。第一种可能的解决方案是使用俄罗斯地区

要使Windows应用程序正确支持Unicode文件名,它需要将路径处理为宽字符。例如,
int main(int argc,const char*argv[])
经典签名必须替换为
int wmain(int argc,const wchar*argv[])
。对于像GCC这样的可移植软件来说,这是一个不值得考虑的复杂问题。很少有人会在源文件路径中放置超出其当前区域设置的字符


我在Cygwin上尝试了G++10.2.0,效果很好。这是因为所有Cygwin软件都与
cygwin1.dll
链接,后者与其他服务一起自动将所有UTF-8路径转换为UTF-16。

您应该首先使用
GetCommandLineW
函数()获取UTF16编码的命令行,然后使用
CommandLineToArgW
()分离令牌


如果您想要UTF8编码的字符串,您需要转换它们,可以找到在C++20中转换不同编码字符串的开源和有用的工具。

在命令提示符窗口
chcp
中运行时,您会看到什么,以根据为您的帐户配置的国家/地区和下一个
dir“%UserProfile%\Desktop”显示Windows命令处理器默认使用的/AD/B
?我假设
chcp
输出或872 or,g++希望像在Linux上或代码页上一样使用UTF-8编码的西里尔字母。在命令提示窗口
chcp 65001
中使用UTF-8设置字符编码,然后运行g++?当我运行
chcp
时,它说我的活动代码页是437。我真的不知道那是什么,但我的Windows设置为英语。我试着运行
chcp 65001
,然后我又试着在旧文件夹上运行g++了,但它给了我同样的错误。北美OEM绝对不是您应该在文件/文件夹名称中使用西里尔字母的代码页,因为此代码页(表)根本不支持这些字符。您也可以像我一样使用英文Windows,但您应该为您的国家/地区正确配置区域/国家。请参阅示例。在正确配置国家/地区后,下次重新启动Windows。然后打开命令提示符窗口,再次运行
chcp
。现在应该有输出了我在第一条评论中已经写过的OEM代码页之一。也可以在命令提示符窗口中使用
chcp 855
chcp 866
将代码页从
437
更改为支持西里尔字母的代码页,然后使用MinGW
g++
。但最好是正确配置国家或继续使用美国,不要在文件/文件夹名称中使用西里尔字母。我认为可以为控制台程序设置UTF-8。谢谢您的回答。在我的Windows上,我把一切都设置为英语,我更喜欢这样。我想我可能不得不避免使用西里尔字母作为我的文件夹和文件名,因为这似乎不是一个简单的解决方案。通常在Windows上,如果需要管理任何非ASCII输入/输出,您应该始终使用W结尾的I/O函数版本,由于这些命令的正常版本在很大程度上取决于当前的提示代码页(Windows使用的单字节ASCII扩展编码,如Latin1),这在不同的计算机上差异很大。GCC是一个跨平台应用程序,支持许多不同的平台。您不能期望它使用特定于平台的代码达到这样的程度。Windows上不存在GCC,有Cygwin和MinGW;)它们在cin、cout和cerr中的行为与非ASCII字符非常不同:Cygwin将全部转换为UTF8,而MinGW使用默认代码页(例如1251),如果您想在UTF8/UTF16转换中增加额外开销,并且只处理UTF8字符串,那么您应该使用Cygwin而不是MinGW(但问题是关于MinGW)。否则,您可以使用链接库编写支持编码的程序。通过自己从源代码构建用于Windows的GCC,我可以向您保证它确实存在于Windows中。MinGW是构建它所依据的系统库(与其他平台上的newlib非常相似)。这个问题的主题是为什么GCC本身不支持Unicode字符,而不是如何编写支持Unicode字符的程序。