2011年1月5日 星期三

中文讀檔

作者: 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

沒有留言:

張貼留言

您好.本資料庫並非第一手資料.如果你有對文章作者的詢問,意見與需求,請自行找尋文章作者並提供意見,謝謝.