看板 C_and_CPP 關於我們 聯絡資訊
: → priv:2011年早就沒幾個人還在用cout,都要用wcout 10/17 16:09 : → priv:mingw根本不支援wcout 10/17 16:09 : → priv:幹嘛要讓學生學了好多年deprecated的mbcs之後 10/17 16:10 : → priv:等遇到問題才要重學再習慣一次wide char? 10/17 16:10 : → priv:不過學校的老師到底有沒有跟上這個世界的腳步也是問題就是了 10/17 16:14 : → legnaleurc:現在哪個 OS 的 console 有支援 wcout ? 10/17 23:38 : 推 priv:windows 10/18 08:46 : → priv:其它平台管不著,但是dev c++也是win底下的 10/18 08:47 : → priv:甚至現在cygwin 1.7也可以用到完整的utf-8函數再幫你接到系 10/18 08:48 : → priv:統的unicode去 10/18 08:49 : → priv:mingw完整性差太遠 10/18 08:49 : 推 priv:而且我不太相信現在linux的terminal都utf8 ready那麼多年還 10/18 08:54 : → priv:不能wcout 10/18 08:54 : → legnaleurc:那我建議你可以去試試看 ... 10/18 21:31 : → legnaleurc:wide stream 的問題很麻煩 10/18 21:33 : → legnaleurc:唔 ... 我用 VC2010 的 wcout 也印不出來 QQ 10/18 21:42 : → priv:因為你印的不是wide char吧 10/18 21:44 : → priv:std::wcout << L"test" << std::endl; 10/18 21:45 : → tropical72:奇怪,加L反而印不出來 std::wcout << L"許功蓋\n"; 10/18 22:11 單純好奇 code 如下: https://gist.github.com/619053 手上試過 Debian (gcc 4.6), Ubuntu (gcc 4.6), Windows 7 (VC 10) 不是印不出來就是問號 iconv 還會很貼心的加上 BOM -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.37.37.29
priv:我有推在前一篇了,基本上wcout輸出會經過一個locale facet 10/19 00:03
priv:所以在Linux底下你必須設定好imbue/locale才能正常輸出 10/19 00:03
priv:windows底下利用locale雖然可以正確輸出到檔案 10/19 00:04
priv:但是由於C++ library的部份不支援unicode console 10/19 00:04
priv:所以必須利用系統原有的code page才能顯示 10/19 00:05
james732:這篇文章的前一篇在哪裡....XD 10/19 00:05
priv:而且受限於code page不能完整利用unicode的功能 10/19 00:05
priv:以Windows來說必須利用WriteConsole api才能完整使用unicode 10/19 00:06
priv:Linux的範例: http://codepad.org/DBnvXHTe 10/19 00:08
priv:Windows的wcout範例: http://codepad.org/1Opyaezt 10/19 00:11
james732:p大你太棒了,我一直搞不清楚wcout要怎麼用... 10/19 00:12
tropical72:p大你真的太棒了 @james:前一篇: #1EbUMtjf 10/19 00:56
james732:感謝樓上XD 10/19 00:59
legnaleurc:這就是我想問的 XD, 雖然我還是不認為這東西好用 10/19 01:32
legnaleurc:咦 ... 我還是印不出來 orz 你的 Linux sample 是因為 10/19 01:39
legnaleurc:string literal 原本就是 UTF-8 嗎? 10/19 01:39
james732:Linux的我可以印出來耶 10/19 01:41
legnaleurc:我是用我原本的 code, 加上 wcout.imbue 10/19 01:42
legnaleurc:如果 string literal 原本就是 UTF-8, 那 cout 也一樣 10/19 01:43
priv:wcout的重點在於internal是wide char 10/19 09:15
priv:cout的話相當於用C locale去處理 10/19 09:16
priv:所以本來是什麼就是印什麼 10/19 09:16
priv:如果說整個系統的LC都是utf8,你要顯示utf8不是問題 10/19 09:17
priv:但是想要利用wide char的function處理文字就會有困難 10/19 09:17
legnaleurc:well, 你有用我寫的 code 去試嗎? 10/19 12:02
legnaleurc:我的重點在 L"" <= 裡面的內容如果原本就是 UTF-8 10/19 12:02
legnaleurc:那不只 wcout, cout 出來的效果也一樣 10/19 12:03
legnaleurc:我現在就是轉成 wchar_t 的 encoding (UTF32) 印不出來 10/19 12:03
legnaleurc:才有這個疑問 10/19 12:03
james732:我跑priv的程式可以印,但l大的程式也一樣是???? 10/19 12:04
angleevil:不知道有高手想整理這篇嘛... 10/19 12:45
priv:編程式的時候compiler處理L""其實有另外的問題 10/19 12:51
priv:windows底下可以把.cpp用utf16le去儲存 10/19 12:52
priv:那L""放進wchar就不會有疑問 10/19 12:52
priv:其它平台的話只能見招拆招... 10/19 12:52
priv:比較實際的作法還是從resource file讀wide char進來 10/19 12:54
priv:而不是一定要想辦法把unicode embed到cpp裡面 10/19 12:54
priv:你那個程式我不是很了你想要做到的是什麼 10/19 12:55
priv:所以沒辦法明確找到方向去試著改.. 10/19 12:55
priv:http://codepad.org/HQY12uQn 10/19 13:26
priv:這是我改過可以在linux底下印出「正體中文」四個字的cpp 10/19 13:26
priv:Linux的範例其實也是從別的地方抄來的 10/19 13:27
priv:看起來重點依然是要有imbue設定完成才能印出 10/19 13:27
priv:相對來說如果今天用wcin讀檔的話就不需要經過複雜的iconv了 10/19 13:30
priv:測試環境為Ubuntu 10.10 gcc 4.4.5 10/19 13:32
priv:另外linux的editor目前起來也都可以save utf-8 10/19 13:39
priv:.cpp內嵌utf8的L"" string應該是沒什麼問題的 10/19 13:39
priv:sorry,目前看起來 10/19 13:39
priv:如果有需要處理多國語言的人參考看看吧 10/19 13:40
james732:再推一次priv的範例,我也跑出了「正體中文」 10/19 13:40
legnaleurc:literal 裡面放 UTF-8 字串在 VC 會有問題,因為 10/19 14:49
legnaleurc:cl.exe 會用目前的 system locale 作為 source file 的 10/19 14:49
legnaleurc:encoding, 很蠢,所以我才會用 hex 表達 UTF-8 10/19 14:50
legnaleurc:另外 wchar_t 在兩個系統分別要是 UTF-16 和 UTF-32 10/19 14:51
legnaleurc:這是為什麼會有 iconv 和 MultiByteToWide 的理由 10/19 14:51
legnaleurc:我照你的寫法關閉了 sync 果然就沒問題了,不過看說明 10/19 14:52
legnaleurc:還是不太了解這是什麼原理?C 的 stdio 錯了嗎? 10/19 14:53
legnaleurc:另外,如果能使用使用者當下的 locale, 可能會更完整? 10/19 14:55
priv:windows底下其實為了避免locale不對可能要先執行chcp 10/19 14:58
priv:我相信在Linux底下應該也是有辦法取得當前的locale 10/19 14:59
VictorTom:推長知識:) 10/19 20:29
firejox:iconv是好物呀~~~ 10/19 20:56
uranusjr:https://gist.github.com/1299077 ╮(╯_╰)╭ 10/20 01:46
xatier:長知識了 10/20 01:49