2012-01-15 80 views
3
#include <fcntl.h> 
#include <io.h> 
#include <stdio.h> 

int main(void) { 
    _setmode(_fileno(stdout), _O_U16TEXT); 
    wprintf(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd\n"); 
    return 0; 
} 

回報在編譯錯誤:_O_U16TEXT was not declared in this scope_O_WTEXT,_O_U16TEXT,_O_U8TEXT - 這些模式在mingw編譯器中是否可行,是否有任何解決方法?

這是一個表明,塞與此編譯器?

+1

我想你是這裏的操作說明:傳統觀念滯後,又名什麼@# %&*是_O_U16TEXT?](http://blogs.msdn.com/b/michkap/archive/2008/03/18/8306597.aspx)問題是,所有這些都是微軟C運行時庫的一部分,以及它最近的一個版本。除非與MinGW捆綁在一起,否則它可能完全重複了這一功能,否則可能會失敗。 – 2012-01-15 17:05:27

+0

對於MingW,您可能需要將'WINVER'和'__MSVCRT_VERSION__'這樣的宏定義爲足夠高的值以啓用某些功能。在頭文件中搜索你想要的符號,並檢查環境'#if'子句。 (我昨天對你的問題進行了測試,但是遺憾的是我從此刪除了它。) – 2012-01-15 18:47:47

+1

我有MinGW g ++ 4.8.1的股票安裝,它適用於我,所以也許這對新版本來說不是問題。當然,我有我的命令提示字體lucinda控制檯... – 2014-03-19 03:10:49

回答

2

好吧,有一個簡單的解決方法:只需使用這些常量的值而不是它們的名稱。例如,_O_U16TEXT0x00020000_O_U8TEXT0x00040000

我剛剛證實,它在Windows 10使用G ++ 4.8.1與_setmode工作:

#include <iostream> 
#include <fcntl.h> 
#include <io.h> 
#include <stdio.h> 

int main() { 
    _setmode(_fileno(stdout), 0x00020000); // _O_U16TEXT 
    std::wcout << L"Русский текст\n"; 
} 
+3

或者只是MinGW-w64,更好的mingw叉 – 2016-03-05 10:52:46

1

不要打擾它。

您的用戶需要將他的控制檯的字體設置爲一個unicode(例如Lucida控制檯),否則它不會顯示任何內容。如果您的目標是東亞,默認字體是unicode意識到的,它會顯示正常,但在歐洲,您必須手動更改字體。

用戶不會更改他們的控制檯字體,因爲您將其寫入自述文件中。他們甚至不會閱讀自述文件,他們只會看到它顯示垃圾,他們會認爲該程序不起作用。另外,它是VS 2005的一個非常新的功能,所以你需要鏈接VS 2005可重新發布,msvcr50.dll或更新(默認情況下mingw鏈接到msvcrt.dll)。如果你不這樣做,文本將不會顯示。

而且我認爲一個簡單的管道會殺死你新的閃亮的unicode文本。假設你的exe名爲a.exe。我很確定,a.exe | more不會顯示unicode文本。

+5

不知道七年(在你的寫作時間;十現在)計爲「相當新的」。 – 2015-07-20 10:34:17

+0

這並不完全正確。您的用戶已經可以擁有包含所有需要的字符的字體。例如,西里爾字體今天非常普遍。我認爲我從接受的答案中得出的例子_應該在任何最近的Windows版本上顯示適當的字形。 – ForNeVeR 2016-04-22 08:41:01

+0

當流指向管道或文件時,這些標誌將字節編碼設置爲UTF-8或UTF-16LE。你可以配置cygwin的'more'來讀取UTF-8,一些Windows本地軟件使用UTF-16。 Win32控制檯是本地Unicode,因此當流爲控制檯時,這些標誌不會做任何事情。但實際上,如果你沒有設置其中一個標誌(代碼頁中的哪一個並不重要),那麼代碼頁外的字符就會映射到'?'。我認爲設定它們是無害的;在最壞的情況下,你會看到'▯'而不是''。 – benrg 2016-07-09 22:02:11

相關問題