| adm | Find | login register |
eliu joined: 2007-08-09 posted: 11474 promoted: 617 bookmarked: 187 新竹, 台灣 |
在 gcc C/C++ 裡面,我們可以dynamic allocate local variable (stack memory)。 例如
a,b 是variable Visual Studio 2008 C++ 還不行。只好用 new delete 去 allocate/free memory。 如果預估的 maximum size 不是很大,乾脆寫成 constant,省得麻煩。 stack size 一般只有幾 mega 而已,是可以用 ulimit -s 設定, 不要把 stack 操爆了。如果你 stack 設定很大,那 heap memory 就變小了。 $ ulimit -a
... edited: 5
| ||||||||||
eliu joined: 2007-08-09 posted: 11474 promoted: 617 bookmarked: 187 新竹, 台灣 |
UTF-8 > 128 中文 string const 在 Visual C++ 2008 不支援,只好轉成用 \ 的方式,是用小程式 print 出來的。 Visual C++ 對有中文的 .cpp也可以用 UTF-8 儲存。如果用UTF-16 儲存 size 就變成兩倍。
char *pho_chars[]={ edited: 3
| ||||||||||
eliu joined: 2007-08-09 posted: 11474 promoted: 617 bookmarked: 187 新竹, 台灣 |
Visual Studio C++ 2008 是用 .cpp 開頭的 ef bb bf 這個 zero-width UTF-8 character 的來辨識 file 是否是 UTF-8 的 file。Visual Studio 稱此為 UTF-8 signature (UTF-8 簽章),當 file 沒有此 UTF-8 signature(UTF-8 簽章) 就無法正確讀取 UTF-8 的中文。如果 file 沒有 UTF-8 signature,也可以用 notepad open 然後 save。 GCC 4.4 就支援 UTF-8 signature,< 4.4會造成 errors。 edited: 3
| ||||||||||
caleb joined: 2007-09-22 posted: 630 promoted: 134 bookmarked: 90 |
M$ 一貫都用此愚蠢的東西判定是否 UTF-8,但實際上 UTF-8 是完全不需要 Byte-order mark 的。 事實上,在 UTF-8 檔案裡加入 BOM 絕對是 bug,只不過所有的 win32 都預設使用此 bug,而且遇到沒 bug 的檔案還認不出來。 | ||||||||||
ychao joined: 2007-10-25 posted: 298 promoted: 21 bookmarked: 3 |
UTF-8跟UTF-16存中文的size是一樣的吧?只有英數字才有三倍的差別? | ||||||||||
本人已不在此站活動 joined: 2007-09-19 posted: 4946 promoted: 325 bookmarked: 206 歸隱山林 |
不是吧?UTF-8 是 1-6 byte 的 multiple byte charater encoding,UTF-16 是一個或多個固定 16 bit 的 wide character encoding。一般來說,中文的話,應該是 UTF-16 較省空間。 所以,UTF-8 才會沒有 endian 的問題,而 UTF-16 有。
| ||||||||||
eliu joined: 2007-08-09 posted: 11474 promoted: 617 bookmarked: 187 新竹, 台灣 |
我的意思是 .c .cpp file主要還是以 ascii english( 1 byte) 為主,UTF-8 中文(2-4byes)只是很小一部份,如果用 UTF-16(2 or 4 bytes)儲存,應該可視為 file size 變成兩倍。
edited: 1
| ||||||||||
本人已不在此站活動 joined: 2007-09-19 posted: 4946 promoted: 325 bookmarked: 206 歸隱山林 |
是的,我知道。我是針對 ychao 回應的。英文佔絕大多數的話,當然 utf8 較不佔空間(1 byte vs. 2 bytes)。
edited: 1
| ||||||||||
eliu joined: 2007-08-09 posted: 11474 promoted: 617 bookmarked: 187 新竹, 台灣 |
很不幸的,即使有 UTF-8 signature,Visual Studio 2008 C++ compiler 依然會把 const string literal 變成 Big5,目前找不到解法。 只好用 _(L"中文") _() 是一個自己定義 UTF-16 轉 UTF-8 的 function 不過在 Linux 端 _() function call 會造成 size 變大一些,gcc 沒有此問題,所能不用 _() 最好 如果定義 #define L "" 應該可以避掉此問題? edited: 2
| ||||||||||
caleb joined: 2007-09-22 posted: 630 promoted: 134 bookmarked: 90 |
用 _() 可能和 i18n 的 _() 衝突,建議用 __() 或是別的啥的。 雖然看起來只用在 fixed string,似乎和 i18n 無關 (gcin i18n 目前沒翻譯一些寫死的字串,例如"全/半"之類的)
萬一不行反正還有
| ||||||||||
eliu joined: 2007-08-09 posted: 11474 promoted: 617 bookmarked: 187 新竹, 台灣 |
如果要分開就不能共用了 反正 _() 是 macro, 也可以用 #if 定義你要的。 | ||||||||||
caleb joined: 2007-09-22 posted: 630 promoted: 134 bookmarked: 90 |
所有 string 都變成 _(L"foo") 了? 反正 win32 應該也不需要 i18n,那還是用 _() 吧。 | ||||||||||
eliu joined: 2007-08-09 posted: 11474 promoted: 617 bookmarked: 187 新竹, 台灣 |
原本想用 #define L "" 的方式。不過在 gcc 上無法使用這個方式,最後只好變成 _(_L("中文")),看起來很醜,都是 Visual Studio 害的。_(_L()) 也可以合併簡化變成裏面也同時把 UTF-16 轉成 UTF-8,以後再說。 L ## x 的用法是從 Win32 tchar.h 挖出來的,看那個 _T(x) 學來的。## 意思好像是接起來的意思。
edited: 4
| ||||||||||
eliu joined: 2007-08-09 posted: 11474 promoted: 617 bookmarked: 187 新竹, 台灣 |
在 Visual Studio/C++ 2010 SP1 有解了,這樣在 win32 使用 gtk 就更容易了。可以用
指定 text 在 compile 時 string encoding 要用 UTF-8,不要弄成 ANSI,就可以避免 string 被轉成 big5。 |
| adm | Find | login register |