作者: NDark (溺於黑暗)
標題: 中文讀檔
時間: Fri Mar 19 09:53:57 2010
※ 引述《ckp4131025 (ckp4131025)》之銘言:
: 事情是這樣的
: 我用我C寫出來的執行檔(exe)
: 似乎只要printf中文
: 就會出現亂碼
: 所以都只能用英文
: 有人知道要調整甚麼參數或是灌甚麼軟體嗎
: (cmd的部分到是可以支援中文,所以我也不知道為什麼)
: 所以我寫讀檔程式讀出來的中文都變亂碼QQ
有關中文的問題(或是非26英文字母的問題)常常造成軟體人的困擾.
我一直以來也是頗為頭大.因此之前認真的survey了一下.
有關中文的問題包含兩個問題字碼(字元集)與編碼.
編碼就是ASCII,unicode,UTF-8等的問題.
同樣一個字佔據檔案中的byte數目與數值都不相同.
開檔後要先辨識是什麼編碼的檔案,再讀進來轉換.
字元集(page)就是BIG5,GB等編碼,主要是把字的值對應到系統中那個page的什麼字.
因此就算你正確的把文字檔案讀進來,你都要面對這個字的值到底是什麼中文字的問題.
(這裡是視窗作業系統的問題)
如果用錯了page,就會發生類似 "囧囧囧囧喳喳囧囧囧囧" 這種奇怪的字串.
(如果故意把網頁的"編碼"改變也可以得到相同的結果)
另外,讀中文路徑也是一個很頭大的問題,因為中文是雙字元,
儘管視窗認識雙字元
(或是說Visual Studio認識雙字元,
debug的時候不會把你的中文拆成兩個數值
你可以清楚的在watch視窗中看到"C:\我的路徑\"這樣的字串)
你開檔的工具並不一定認識,因此很有可能會開檔失敗.
如果開檔失敗,後面編碼與字碼就不用談了.
如果你使用VC.net的套件開檔,對於這些的支援幾乎是沒問題的.
但如果你使用C/C++的開檔工具,就很有可能他預設的字碼是ASCII,
(以std::locale來說就可能預設為"C")
開檔的時候就只認識英文等基本符號
以std::fstream為例,
我的做法是在開檔之前先把std::locale切換為"視窗預設",
也就是VS的預設字碼.也就是""一個字串,管他是什麼,就是預設就對了.
locale::global( locale( "" ) ) ; // 事實上是"Chinese_Taiwan.950"
然後再開檔.
ofstream FILEP ;
FILEP.open( "C:\\測試\\test.txt" ) ;
開檔正常之後接下來你再去處理讀檔跟編碼字碼的轉換問題.
PS.
我習慣設定locale的時候保留原本的設定
locale preLocale = locale::global( locale( “Chinese_Taiwan.950” ) ) ;
開檔完畢再把原來的locale放回去
locale::global( locale( preLocale ) ) ;
最後強調一點.我對於真正為什麼不是很清楚.
也許我只是誤打誤撞才弄成功.
對這個問題有深刻了解的朋友請多多指教.
--
"May the Balance be with U"(願平衡與你同在)
視窗介面遊戲設計教學( http://0rz.tw/V28It ),討論,分享。歡迎來信。
視窗程式設計(Windows CLR Form)遊戲架構設計(Game Application Framework)
遊戲工具設計(Game App. Tool Design )
電腦圖學架構及研究(Computer Graphics)論文代讀(含投影片製作)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.96.77.176
沒有留言:
張貼留言
您好.本資料庫並非第一手資料.如果你有對文章作者的詢問,意見與需求,請自行找尋文章作者並提供意見,謝謝.