Re: [討論] 徵求支援 wide iostream 的平台

看板C_and_CPP (C/C++)作者 (CA)時間14年前 (2011/10/18 23:24), 編輯推噓6(6058)
留言64則, 9人參與, 最新討論串1/1
: → 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

10/19 00:03, , 1F
我有推在前一篇了,基本上wcout輸出會經過一個locale facet
10/19 00:03, 1F

10/19 00:03, , 2F
所以在Linux底下你必須設定好imbue/locale才能正常輸出
10/19 00:03, 2F

10/19 00:04, , 3F
windows底下利用locale雖然可以正確輸出到檔案
10/19 00:04, 3F

10/19 00:04, , 4F
但是由於C++ library的部份不支援unicode console
10/19 00:04, 4F

10/19 00:05, , 5F
所以必須利用系統原有的code page才能顯示
10/19 00:05, 5F

10/19 00:05, , 6F
這篇文章的前一篇在哪裡....XD
10/19 00:05, 6F

10/19 00:05, , 7F
而且受限於code page不能完整利用unicode的功能
10/19 00:05, 7F

10/19 00:06, , 8F
以Windows來說必須利用WriteConsole api才能完整使用unicode
10/19 00:06, 8F

10/19 00:08, , 9F
10/19 00:08, 9F

10/19 00:11, , 10F
Windows的wcout範例: http://codepad.org/1Opyaezt
10/19 00:11, 10F

10/19 00:12, , 11F
p大你太棒了,我一直搞不清楚wcout要怎麼用...
10/19 00:12, 11F

10/19 00:56, , 12F
p大你真的太棒了 @james:前一篇: #1EbUMtjf
10/19 00:56, 12F

10/19 00:59, , 13F
感謝樓上XD
10/19 00:59, 13F

10/19 01:32, , 14F
這就是我想問的 XD, 雖然我還是不認為這東西好用
10/19 01:32, 14F

10/19 01:39, , 15F
咦 ... 我還是印不出來 orz 你的 Linux sample 是因為
10/19 01:39, 15F

10/19 01:39, , 16F
string literal 原本就是 UTF-8 嗎?
10/19 01:39, 16F

10/19 01:41, , 17F
Linux的我可以印出來耶
10/19 01:41, 17F

10/19 01:42, , 18F
我是用我原本的 code, 加上 wcout.imbue
10/19 01:42, 18F

10/19 01:43, , 19F
如果 string literal 原本就是 UTF-8, 那 cout 也一樣
10/19 01:43, 19F

10/19 09:15, , 20F
wcout的重點在於internal是wide char
10/19 09:15, 20F

10/19 09:16, , 21F
cout的話相當於用C locale去處理
10/19 09:16, 21F

10/19 09:16, , 22F
所以本來是什麼就是印什麼
10/19 09:16, 22F

10/19 09:17, , 23F
如果說整個系統的LC都是utf8,你要顯示utf8不是問題
10/19 09:17, 23F

10/19 09:17, , 24F
但是想要利用wide char的function處理文字就會有困難
10/19 09:17, 24F

10/19 12:02, , 25F
well, 你有用我寫的 code 去試嗎?
10/19 12:02, 25F

10/19 12:02, , 26F
我的重點在 L"" <= 裡面的內容如果原本就是 UTF-8
10/19 12:02, 26F

10/19 12:03, , 27F
那不只 wcout, cout 出來的效果也一樣
10/19 12:03, 27F

10/19 12:03, , 28F
我現在就是轉成 wchar_t 的 encoding (UTF32) 印不出來
10/19 12:03, 28F

10/19 12:03, , 29F
才有這個疑問
10/19 12:03, 29F

10/19 12:04, , 30F
我跑priv的程式可以印,但l大的程式也一樣是????
10/19 12:04, 30F

10/19 12:45, , 31F
不知道有高手想整理這篇嘛...
10/19 12:45, 31F

10/19 12:51, , 32F
編程式的時候compiler處理L""其實有另外的問題
10/19 12:51, 32F

10/19 12:52, , 33F
windows底下可以把.cpp用utf16le去儲存
10/19 12:52, 33F

10/19 12:52, , 34F
那L""放進wchar就不會有疑問
10/19 12:52, 34F

10/19 12:52, , 35F
其它平台的話只能見招拆招...
10/19 12:52, 35F

10/19 12:54, , 36F
比較實際的作法還是從resource file讀wide char進來
10/19 12:54, 36F

10/19 12:54, , 37F
而不是一定要想辦法把unicode embed到cpp裡面
10/19 12:54, 37F

10/19 12:55, , 38F
你那個程式我不是很了你想要做到的是什麼
10/19 12:55, 38F

10/19 12:55, , 39F
所以沒辦法明確找到方向去試著改..
10/19 12:55, 39F

10/19 13:26, , 40F

10/19 13:26, , 41F
這是我改過可以在linux底下印出「正體中文」四個字的cpp
10/19 13:26, 41F

10/19 13:27, , 42F
Linux的範例其實也是從別的地方抄來的
10/19 13:27, 42F

10/19 13:27, , 43F
看起來重點依然是要有imbue設定完成才能印出
10/19 13:27, 43F

10/19 13:30, , 44F
相對來說如果今天用wcin讀檔的話就不需要經過複雜的iconv了
10/19 13:30, 44F

10/19 13:32, , 45F
測試環境為Ubuntu 10.10 gcc 4.4.5
10/19 13:32, 45F

10/19 13:39, , 46F
另外linux的editor目前起來也都可以save utf-8
10/19 13:39, 46F

10/19 13:39, , 47F
.cpp內嵌utf8的L"" string應該是沒什麼問題的
10/19 13:39, 47F

10/19 13:39, , 48F
sorry,目前看起來
10/19 13:39, 48F

10/19 13:40, , 49F
如果有需要處理多國語言的人參考看看吧
10/19 13:40, 49F

10/19 13:40, , 50F
再推一次priv的範例,我也跑出了「正體中文」
10/19 13:40, 50F

10/19 14:49, , 51F
literal 裡面放 UTF-8 字串在 VC 會有問題,因為
10/19 14:49, 51F

10/19 14:49, , 52F
cl.exe 會用目前的 system locale 作為 source file 的
10/19 14:49, 52F

10/19 14:50, , 53F
encoding, 很蠢,所以我才會用 hex 表達 UTF-8
10/19 14:50, 53F

10/19 14:51, , 54F
另外 wchar_t 在兩個系統分別要是 UTF-16 和 UTF-32
10/19 14:51, 54F

10/19 14:51, , 55F
這是為什麼會有 iconv 和 MultiByteToWide 的理由
10/19 14:51, 55F

10/19 14:52, , 56F
我照你的寫法關閉了 sync 果然就沒問題了,不過看說明
10/19 14:52, 56F

10/19 14:53, , 57F
還是不太了解這是什麼原理?C 的 stdio 錯了嗎?
10/19 14:53, 57F

10/19 14:55, , 58F
另外,如果能使用使用者當下的 locale, 可能會更完整?
10/19 14:55, 58F

10/19 14:58, , 59F
windows底下其實為了避免locale不對可能要先執行chcp
10/19 14:58, 59F

10/19 14:59, , 60F
我相信在Linux底下應該也是有辦法取得當前的locale
10/19 14:59, 60F

10/19 20:29, , 61F
推長知識:)
10/19 20:29, 61F

10/19 20:56, , 62F
iconv是好物呀~~~
10/19 20:56, 62F

10/20 01:46, , 63F
10/20 01:46, 63F

10/20 01:49, , 64F
長知識了
10/20 01:49, 64F
文章代碼(AID): #1EdPeY25 (C_and_CPP)
文章代碼(AID): #1EdPeY25 (C_and_CPP)