[問題] 跨平台Unicode寫法??

看板C_and_CPP作者 (mail6543210)時間13年前 (2012/02/23 00:20), 編輯推噓1(1016)
留言17則, 6人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) gcc 3.4.4 on cygwin gcc 4.??(最新版) on mingw32 under cygwin(specs中有-lmsvcrt) gcc 4.??(最新版) on Linux WinXP,Ubuntu 10.04+ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) NULL 問題(Question): 我想寫一個程式可以讀寫unicode的文字檔,且其內部處理也用Unicode。 他需要能跨平台。 這幾天沒有Linux可測試,暫時是用cygwin,分別跑FLAG 沒有/有 "-mno-cygwin" code:原始碼皆是由UTF-8無BOM,CRLF儲存 ori.c::最一般的版本 #include<stdio.h> int main() { FILE *f=fopen("ori.txt","w"); fputs("我\n",f); fclose(f); return 0; } command: gcc -mno-cygwin ori.c -o ori.exe result:UTF-8無BOM(又如果我要寫成big5格式呢??) 我<CRLF> 這是我要的結果沒錯,可是跟下面兩個有甚麼差別?? 有用UNICODE和沒用UNICODE要怎麼分辨?? tchar.c:: #include<tchar.h> #include<stdio.h> //上面兩行順序有差嗎?? int main()//這裡需要用_tmain嗎?? { FILE *f=_tfopen(_T("tchar.txt"),_T("w")); _fputts(_T("我\n"),f); fclose(f); return 0; } command: gcc -mno-cygwin tchar.c -o tchar.exe result: (同上) command: gcc -mno-cygwin -D_UNICODE tchar.c -o tchar.exe result: (空檔案,錯誤) (用_tmain會噴libmingw32.a ... in main() ... undefuined ref...to `_WinMain@16`) wchar.c:: #include<stdio.h> int main() { FILE *f=_wfopen(L"wchar.txt",L"w"); fputws(L"我\n",f); fclose(f); return 0; } command: gcc -mno-cygwin wchar.c -o wchar.exe result: (空檔案,錯誤) (若把maine改成wmain也會噴`_WinMain@16`) [若把main改成WinMain]-> (空檔案,噴waring:resolving _WinMain@16 by linking to _WinMain) 有幾個問題請教:: 1.用tchar.c不加-D_UNICODE是否完全等於ori.c?? 反之,加了-D_UNICODE是否全等於wchar.c?? 2.用ori.c就已經是utf8(unicode)了,為何還需要TCHAR等#define _UNICODE? 而且事實上用了反而無結果?? 是因為我系統本身就是XP(unicode)嗎?? >>若是,何時才用得到TCHAR??(難道是UTF8和Unicode的區別??) 3.為何wchar.c會錯誤?? 我研究好一段時間了還是不大懂... 上面都是使用-mno-cygwin,下面直接用gcc XXX.c -o XXX.exe ori.c:: result:UTF-8無BOM 我<LF> tchar.c:: 找不到tchar.h,畢竟這是windows才有的。 wchar.c:: 找不到_wfopen(),windows only. 所以所謂的使用UNICODE是指甚麼?? Win上跟Linux上寫法有甚麼差異?? (Win上的部分是否可以直接用cygwin下加-mno-cygwin來模擬?? Linux上的部分是否可用cygwin(POSIX)直接模擬??) 以上我有誤解哪些部份嗎?? 另外,有沒有推薦的open-source軟體是有ANSI/Unicode雙版本而且可以跨平台的?? 這樣我可以直接參考它的原始碼?? 先謝過眾板友~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.103.83

02/23 00:29, , 1F
SciTE
02/23 00:29, 1F

02/23 04:03, , 2F
utf8不是unicode唷
02/23 04:03, 2F

02/23 09:18, , 4F
意思就是說在Linux下,一般軟體不論內外都是用UTF8,
02/23 09:18, 4F

02/23 09:18, , 5F
那要如何實做呢??
02/23 09:18, 5F

02/23 09:19, , 6F
Win下又要如何實作??我用tchar結果好像怪怪的
02/23 09:19, 6F

02/23 10:52, , 7F
x86的機器下通常是用Unicode-LE
02/23 10:52, 7F

02/23 10:52, , 8F
要讀UTF8還要再轉碼
02/23 10:52, 8F

02/23 10:54, , 9F
win下用MultiByteToWideChar()
02/23 10:54, 9F

02/23 13:07, , 10F
Windows 的 wide char 是 UTF-16
02/23 13:07, 10F

02/23 13:29, , 11F
其實我看不懂原po的需求...
02/23 13:29, 11F

02/23 13:51, , 12F
假如是使用gcc 請google
02/23 13:51, 12F

02/23 13:51, , 13F
-finput-charset -fexec-charset 這兩個參數~
02/23 13:51, 13F

02/23 15:40, , 14F
我照樓上google,大致了解.gcc內部不是用UTF8就是Unico
02/23 15:40, 14F

02/23 15:41, , 15F
那TCHAR作用是??我用TCHAR配-D_UNICODE反而錯??
02/23 15:41, 15F

02/23 22:30, , 16F
還是想繼續強調 Unicode != UTF-8
02/23 22:30, 16F

02/26 20:36, , 17F
嗯嗯這個我已經想到了
02/26 20:36, 17F
文章代碼(AID): #1FHHNT0O (C_and_CPP)