[問題] big5 與 utf8 的使用經驗

看板C_and_CPP作者 (pziyout)時間12年前 (2013/02/06 03:27), 編輯推噓10(10040)
留言50則, 16人參與, 最新討論串1/5 (看更多)
最近打算重寫一些程式,需要使用大量的中文字,正在煩惱是否要整個 使用 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

02/06 11:44, , 1F
注音和方塊符號都在unicode裡面喔
02/06 11:44, 1F

02/06 11:46, , 2F
例外的是,以前流行的「unicode補完計畫」
02/06 11:46, 2F

02/06 11:47, , 3F
在big5中追加了日文假名及漢字,大部份的轉碼器不認得
02/06 11:47, 3F

02/06 11:47, , 4F
所以要把含有假名的big5轉utf8需要特殊處理
02/06 11:47, 4F

02/06 11:48, , 5F
實際上big5本身就不是什麼標準,它有一堆該死的變種
02/06 11:48, 5F

02/06 11:49, , 6F
要處理中文還是全部使用unicode吧
02/06 11:49, 6F

02/06 11:58, , 7F
用utf8吧...
02/06 11:58, 7F

02/06 12:00, , 8F
特殊符號可以參考 http://rishida.net/tools/conversion/
02/06 12:00, 8F

02/06 12:09, , 10F
需要注意的是 UTF8 != UTF16,而 WCHAR 的編碼為 UTF16
02/06 12:09, 10F

02/06 12:11, , 11F
更正,WCHAR 是 UCS-2
02/06 12:11, 11F

02/06 12:49, , 12F
介面沒有 GUI 的話,在 Windows 直接用 Big5 就好
02/06 12:49, 12F

02/06 13:02, , 13F
如果你在linux上面 要注意wchar_t不一定是2 bytes
02/06 13:02, 13F

02/06 13:19, , 14F
現在想要有中文就直接用 unicode, wchar wstring...
02/06 13:19, 14F

02/06 13:20, , 15F
用 big5 只是自找麻煩
02/06 13:20, 15F

02/06 13:26, , 16F
都什麼年代了還big5...
02/06 13:26, 16F

02/06 15:20, , 17F
unicode 補完計畫有放出 libiconv 的 patch,打上去就能轉
02/06 15:20, 17F

02/06 22:12, , 18F
之前因為中文註解有許功蓋問題 debug 四小時才找到...
02/06 22:12, 18F

02/06 22:14, , 19F
害我留下陰影 現在都不敢盡情的寫中文註解...
02/06 22:14, 19F

02/06 22:16, , 20F
想不到什麼好的解決方法 只能在每行註解最後面打個底線
02/06 22:16, 20F

02/06 22:17, , 21F
防許功蓋問題出現在最後 把換行字元吃掉
02/06 22:17, 21F

02/06 22:32, , 22F
狠下心來用英文就一勞永逸囉
02/06 22:32, 22F

02/06 23:15, , 23F
plz write codes in English
02/06 23:15, 23F

02/06 23:16, , 24F
遇過的程式碼如果不是需要另外寫文件說明演算法, 就是
02/06 23:16, 24F

02/06 23:17, , 25F
可以清楚到連註解都不用, 看你要選哪個
02/06 23:17, 25F

02/07 00:41, , 26F
But som people hez vely poor Engrish
02/07 00:41, 26F

02/07 09:01, , 27F
jast laik upstare
02/07 09:01, 27F

02/07 14:17, , 28F
看不懂樓上那句話,求解答
02/07 14:17, 28F

02/07 14:31, , 29F
"就像樓上"
02/07 14:31, 29F

02/07 14:32, , 30F
謝謝
02/07 14:32, 30F

02/07 14:39, , 31F
=> just like upstairs
02/07 14:39, 31F

02/07 14:47, , 32F
Zhong guo ren suo zhong wen la
02/07 14:47, 32F

02/07 14:53, , 33F
BiauZhun::ShuChuChuanLiu << "ni hao";
02/07 14:53, 33F

02/07 15:11, , 34F
說中文是這樣的嗎XDDDDD
02/07 15:11, 34F

02/07 16:53, , 35F
註解英文就好了 code沒關係 XD
02/07 16:53, 35F

02/09 00:37, , 36F
loveme00835大大 我覺得程式碼內文裡的中文註解避不掉阿
02/09 00:37, 36F

02/09 00:37, , 37F
的確很好的程式碼(尤其是C++) 可以清楚到不用註解
02/09 00:37, 37F

02/09 00:38, , 38F
但有時要寫很要求效能的C語言 勢必要降低一些可讀性
02/09 00:38, 38F

02/09 00:39, , 39F
舉個例子:
02/09 00:39, 39F

02/09 00:40, , 40F
//原本只要把 ary 之中小於 10 元素遞減
02/09 00:40, 40F

02/09 00:40, , 41F
//為了要求效能 把所有元素都遞減
02/09 00:40, 41F

02/09 00:40, , 42F
//因為 ary 之中大於等於 10 的元素 之後再也不會用到
02/09 00:40, 42F

02/09 00:41, , 43F
for(i = 0; i != N; ++i){ --ary[i]; }
02/09 00:41, 43F

02/09 00:42, , 44F
如果不寫註解 別人哪會想這麼多 看起來只是簡單的for迴圈
02/09 00:42, 44F

02/09 00:43, , 45F
別人可能還覺得程式邏輯有錯 說不定會畫蛇添足
02/09 00:43, 45F

02/09 00:43, , 46F
把迴圈內改成 if(ary[i] > 10) --ary[i];
02/09 00:43, 46F

02/09 00:45, , 47F
這種小 hint 也不知道怎麼寫在說明文件
02/09 00:45, 47F

02/09 00:46, , 48F
說明文件: xxx.c 內 535 行的 for 這樣寫是有用意的!!!
02/09 00:46, 48F

02/09 00:48, , 49F
寫成英文 連我自己都看不懂.... 阿阿啊~~
02/09 00:48, 49F

02/12 22:43, , 50F
這個無法寫英文.........你跟你的team有點令人擔心啊@@"
02/12 22:43, 50F
文章代碼(AID): #1H4SssoC (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1H4SssoC (C_and_CPP)