MinGW-w64 wiki中的文章Unicode应用程序解释了Unicode应用程序的以下示例,例如: _main.c_
:
#define UNICODE
#define _UNICODE
#include <tchar.h>
int _tmain(int argc, TCHAR * argv[])
{
_tprintf(argv[1]);
return 0;
}
上面的代码使用了tchar.h映射,它允许它以Unicode和非Unicode模式进行编译。 [...]如果使用Unicode模式,链接时仍然需要
-municode
选项。
所以我用了
C:\> i686-w64-mingw32-gcc main.c -municode -o hello
_tmain.c:1:0: warning: "UNICODE" redefined
#define UNICODE
^
<command-line>:0:0: note: this is the location of the previous definition
编译Unicode应用程序。但是,当我运行它时,它会返回
C:\> hello Süßer
S³▀er
因此Unicode字符串是错误的。我使用了最新版本4.9.2的MinGW-w64,i686架构并尝试了Win32和POSIX theads变体,两者都导致了同样的错误。我的操作系统是32位德语Windows 7.当我使用Unicode代码页(chcp 65001
)时,我必须使用字体“Lucida Console”。使用此设置,我得到了类似的错误:
C:\> hello Süßer
S��er
我想在Windows C ++程序中使用带有“ü”或“ß”的参数。
nwellnhof是对的:问题是控制台上的输出。 Unicode part 1: Windows console i/o approaches和Unicode part 2: UTF-8 stream mode中解释了此问题。后者为Visual C ++提供了一个解决方案 - 它也适用于英特尔C ++ 15.这篇博客文章“尚未考虑g ++编译器。所有这些代码都是特定于Visual C ++。但是,[博客作者]通常做的与g ++,[他]可能会在第三部分讨论这个问题。“
我想打开一个文件,该名称由参数给出。这很简单,例如。 G。 main.c中:
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
if ( argc > 1 ) {
// The output will be wrong, ...
cout << argv[1] << endl;
// but the name of this file will be right:
fstream fl_rsl(argv[1], ios::out);
fl_rsl.close();
}
return 0;
}
和没有unicode模式的编译
C:\> g++ main.cpp -o hello && hello Süßer
它的控制台输出仍然是错误的,但创建的文件名是正确的。这对我来说没问题。