[問題] 寫出 UTF8 文字檔

看板C_and_CPP作者 (Windows)時間11年前 (2012/10/28 02:41), 編輯推噓5(5024)
留言29則, 9人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Dev C++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) #include "stdio.h" #include "windows.h" 問題(Question): 想要可以寫出 一個文字檔 是使用 UTF8 編碼模式 而且裡面的中文字也不會是亂碼,有 Google 過, UTF8的檔頭 是需要先寫入 0xEF 0xBB 0xBF 這三個 byte! 我也有照實寫入入這三個Byte,這時候再用 Notepad++ 打開來看 的確 編碼方式 變成了UTF8了! 但是...寫入的中文字 卻變成了亂碼 = =a 預期的正確結果(Expected Output): 希望 可以產生的檔案是 UTF8 格式,以及中文字不是亂碼。 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 網頁版 : http://codepad.org/Z71SCAjA #include "stdio.h" #include "windows.h" int main(int argc, char * argv[]){ FILE *fp = NULL; char FileName[] = "test.txt"; char String[] = "哈囉! 你好嘛!? abcdefg"; if ((fp = fopen (FileName, "w")) == NULL) { printf("開啟檔案錯誤!\n"); } else { putc(239,fp); putc(187,fp); putc(191,fp); fprintf (fp, String); fclose (fp); } } 補充說明(Supplement): 希望給個方向,像是有沒有函式可以用,或者 Google 關鍵字的方向ˊˋa 以上 謝謝 >"< -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.161.13.57

10/28 02:52, , 1F
...說真的~你用編輯器看是中文~跟用printf看是中文.
10/28 02:52, 1F

10/28 02:53, , 2F
是兩回事
10/28 02:53, 2F

10/28 02:58, , 3F
UTF-8 不需要 BOM 吧
10/28 02:58, 3F

10/28 03:09, , 4F
喔喔,我找到解決方法了!!
10/28 03:09, 4F

10/28 03:10, , 5F
10/28 03:10, 5F

10/28 10:03, , 6F
希望你知道為啥它要這麼做~ :D
10/28 10:03, 6F

10/28 13:12, , 7F
UTF8 不用 BOM
10/28 13:12, 7F

10/28 13:13, , 8F
你的問題是存檔時根本沒編碼成 UTF8
10/28 13:13, 8F

10/28 13:15, , 9F
如果存的大都是中文字,可考慮用 UTF16 比較省空間
10/28 13:15, 9F

10/28 17:09, , 10F
非常幽默。
10/28 17:09, 10F

10/28 18:55, , 11F
原本我也是用跟你用一樣的編譯器
10/28 18:55, 11F

10/28 18:55, , 12F
直到遇到跟妳一樣的問題 就換codeblock了
10/28 18:55, 12F

10/28 18:56, , 13F
codeblock 可以直接在環境上改成utf8格式
10/28 18:56, 13F

10/28 18:57, , 14F
在devc++雖然也有幾個折衷的辦法 但 還是省點力氣吧
10/28 18:57, 14F

10/28 19:09, , 15F
我以為是跟compiler比較有關係欸 devc 也不是用gcc?
10/28 19:09, 15F

10/28 21:34, , 16F
你的 string 會是什麼編碼完全取決於你的 source code 裡
10/28 21:34, 16F

10/28 21:34, , 17F
string literal 寫出來時是什麼編碼; 有些編譯器會檢查,
10/28 21:34, 17F

10/28 21:35, , 18F
有些會對特定編碼錯誤會警告, 不過 gcc 屬於不管的
10/28 21:35, 18F

10/28 22:25, , 19F
我以為可以在compile時期指定要用啥編碼欸~?
10/28 22:25, 19F

10/28 23:45, , 20F
on-fly convert string literal?有這麼雞婆的compiler?
10/28 23:45, 20F

10/29 19:13, , 21F
你應該要知道你中文字utf8的byte form吧
10/29 19:13, 21F

10/29 19:15, , 22F
我比較好奇這樣寫會輸出big5嗎
10/29 19:15, 22F

10/30 09:06, , 23F
若在windows command prompt下會以big5(windows 1252)為
10/30 09:06, 23F

10/30 09:07, , 24F
預設碼頁。在現在的Linux distro中則都是UTF-8 clean。
10/30 09:07, 24F

10/30 09:07, , 25F
若是微軟現在的IDE應該也都轉為UTF-8 clean,VC6那種上
10/30 09:07, 25F

10/30 09:08, , 26F
古化石(發音為垃圾)就可能還是Big5。
10/30 09:08, 26F

10/30 10:56, , 27F
原po試試看把"哈囉!" 換成 "\xe5\x93\x88\xe5\x9b\x89!"
10/30 10:56, 27F

10/30 10:57, , 28F
再想想看你的IDE的編輯器 為何或如何去認你放進去的
10/30 10:57, 28F

10/30 10:57, , 29F
"哈囉"
10/30 10:57, 29F
文章代碼(AID): #1GZ2h0YT (C_and_CPP)