看板 C_and_CPP 關於我們 聯絡資訊
最近打算重寫一些程式,需要使用大量的中文字,正在煩惱是否要整個 使用 utf8 寬字串,請教有經驗的人是否可分享你的撰寫經驗。 以下是我一些粗略的想法: big5 字串: (1) 可直接使用傳統字串 與 c++ string 表示方式 char * foo = "我" ; string bar = "我是" ; (2) 缺乏一些中文字 (3) 一個 big5 中文字使用 2 bytes 若有中英文混合在一起的字串, 要數中文字字數,需要額外處理 (4) 搜尋於中英混合字串內的文字若不額外處理可能會找錯 (5) 需留意 許功蓋 現象,這可能是最囉唆的 cout << "許\先生在成功\後留下了男人淚\" << endl ; 但以上的輸出字串若由檔案讀入,則不需要另加反斜線 (6) 要列印單一的中文字,有些麻煩 string bar = "第十名" ; cout << bar[2] << bar[3] ; // 印出:十 utf8 寬字串 (1) 寫法有點囉唆 wchar_t * foo = L"我" ; wstring bar = L"我" ; 輸出入需使用 wcout wcin 需使用 wifstream wofstream wistringstream wostringstream 等類別 另需設定語系 LC_ALL (2) 好像缺乏(?)一些原有 big5 的特殊符號,例如:圓圈 方塊 注音符號 等字 例如:○ ● △ ▲ (3) 數中英文混合的字數很方便 wstring foo = L"ipad好貴" ; wcout << foo.size() << endl ; // 6 (4) 可混合語言 (5) 沒有許功蓋的問題 (6) 列印單一字元方便 wstring foo = "i是一隻毛毛蟲" ; for ( int i = 0 ; i < foo.size() ; ++i ) { wcout << foo[i] << " " ; // 每個中英文字後加一個空格 } (7) 傳統的 big5 檔仍然很多,若要讀入於程式中,需額外作檔案轉型或在程式 內使用 mbstowcs 將傳統字串轉為寬字元字串 以上是隨意想到的,有點零散,歡迎各位網友提供你的使用經驗。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.25.21
littleshan:注音和方塊符號都在unicode裡面喔 02/06 11:44
littleshan:例外的是,以前流行的「unicode補完計畫」 02/06 11:46
littleshan:在big5中追加了日文假名及漢字,大部份的轉碼器不認得 02/06 11:47
littleshan:所以要把含有假名的big5轉utf8需要特殊處理 02/06 11:47
littleshan:實際上big5本身就不是什麼標準,它有一堆該死的變種 02/06 11:48
littleshan:要處理中文還是全部使用unicode吧 02/06 11:49
pcyu16:用utf8吧... 02/06 11:58
pcyu16:特殊符號可以參考 http://rishida.net/tools/conversion/ 02/06 12:00
linotwo:需要注意的是 UTF8 != UTF16,而 WCHAR 的編碼為 UTF16 02/06 12:09
linotwo:更正,WCHAR 是 UCS-2 02/06 12:11
purpose:介面沒有 GUI 的話,在 Windows 直接用 Big5 就好 02/06 12:49
chubiei:如果你在linux上面 要注意wchar_t不一定是2 bytes 02/06 13:02
deuter:現在想要有中文就直接用 unicode, wchar wstring... 02/06 13:19
deuter:用 big5 只是自找麻煩 02/06 13:20
holymars:都什麼年代了還big5... 02/06 13:26
tinlans:unicode 補完計畫有放出 libiconv 的 patch,打上去就能轉 02/06 15:20
xxxx9659:之前因為中文註解有許功蓋問題 debug 四小時才找到... 02/06 22:12
xxxx9659:害我留下陰影 現在都不敢盡情的寫中文註解... 02/06 22:14
xxxx9659:想不到什麼好的解決方法 只能在每行註解最後面打個底線 02/06 22:16
xxxx9659:防許功蓋問題出現在最後 把換行字元吃掉 02/06 22:17
purpose:狠下心來用英文就一勞永逸囉 02/06 22:32
loveme00835:plz write codes in English 02/06 23:15
loveme00835:遇過的程式碼如果不是需要另外寫文件說明演算法, 就是 02/06 23:16
loveme00835:可以清楚到連註解都不用, 看你要選哪個 02/06 23:17
uranusjr:But som people hez vely poor Engrish 02/07 00:41
abcsimps:jast laik upstare 02/07 09:01
purpose:看不懂樓上那句話,求解答 02/07 14:17
linotwo:"就像樓上" 02/07 14:31
purpose:謝謝 02/07 14:32
suhorng:=> just like upstairs 02/07 14:39
azureblaze:Zhong guo ren suo zhong wen la 02/07 14:47
azureblaze:BiauZhun::ShuChuChuanLiu << "ni hao"; 02/07 14:53
suhorng:說中文是這樣的嗎XDDDDD 02/07 15:11
purincess:註解英文就好了 code沒關係 XD 02/07 16:53
xxxx9659:loveme00835大大 我覺得程式碼內文裡的中文註解避不掉阿 02/09 00:37
xxxx9659:的確很好的程式碼(尤其是C++) 可以清楚到不用註解 02/09 00:37
xxxx9659:但有時要寫很要求效能的C語言 勢必要降低一些可讀性 02/09 00:38
xxxx9659:舉個例子: 02/09 00:39
xxxx9659://原本只要把 ary 之中小於 10 元素遞減 02/09 00:40
xxxx9659://為了要求效能 把所有元素都遞減 02/09 00:40
xxxx9659://因為 ary 之中大於等於 10 的元素 之後再也不會用到 02/09 00:40
xxxx9659:for(i = 0; i != N; ++i){ --ary[i]; } 02/09 00:41
xxxx9659:如果不寫註解 別人哪會想這麼多 看起來只是簡單的for迴圈 02/09 00:42
xxxx9659:別人可能還覺得程式邏輯有錯 說不定會畫蛇添足 02/09 00:43
xxxx9659:把迴圈內改成 if(ary[i] > 10) --ary[i]; 02/09 00:43
xxxx9659:這種小 hint 也不知道怎麼寫在說明文件 02/09 00:45
xxxx9659:說明文件: xxx.c 內 535 行的 for 這樣寫是有用意的!!! 02/09 00:46
xxxx9659:寫成英文 連我自己都看不懂.... 阿阿啊~~ 02/09 00:48
ah7675:這個無法寫英文.........你跟你的team有點令人擔心啊@@" 02/12 22:43