Windows控制台上的Unicode输出

时间:2015-01-29 13:36:07

标签: c++ windows unicode g++ console-application

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 approachesUnicode 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

它的控制台输出仍然是错误的,但创建的文件名是正确的。这对我来说没问题。

0 个答案:

没有答案