utf-8格式 .ini檔案,讀取與寫入 |
答題得分者是:leveon
|
cceres
一般會員 發表:2 回覆:7 積分:1 註冊:2016-10-17 發送簡訊給我 |
各位大大好
最近在開發多國語言相關的程式 由於希望可以讓使用者自訂介面的文字 又不希望使用資料庫去紀錄 所以小弟選擇ini檔案來儲存資訊 ==================================== 問題: 我的ini儲存格式使用utf-8 目前不管是寫入ini 或是讀取ini 遇到的日文字皆是??? 但是utf8格式的中文字可以正常讀取與寫入 ==================================== 環境使用 C Bulider 6 並安裝第三方元件:Tnt元件(可顯示unicode之元件) ==================================== 目前打在TntStringGrid上的日文字 可以正常顯示於TntLabel上 寫法: wchar_t *str = TntStringGrid1 -> Cells [1][1]; TntLabel1 -> Caption = str; 讀取ini我試了兩種方式,皆失敗 1. 利用TIniFile 2. 利用GetPrivateProfileString 法1: TInifile *ini; ini = new TIniFile(ExtraFilePath(Application-> ExeName) "\\lang\\JA,ini"); TntLabel1 -> Caption = ini -> ReadString("Test","test_01","QQQQQ"); delete ini; 結果: TntLabel1上 顯示????? 法2: 一樣使用TIniFile 但ReadString回來的東西轉為utf8格式 TIniFile *ini; ini = new TIniFile(ExtraFilePath(Application-> ExeName) "\\lang\\JA,ini"); TntLabel1 -> Caption = ini -> ); delete ini; 結果: TntLabel1上 顯示????? 到這裡發現 似乎是TIniFile只能讀取ansiString格式的字串? 於是小弟找另一個方法去讀取ini檔案: GetPrivateProfileString 法3: char str[20]; AnsiString ss = ExtraFilePath(Application-> ExeName) "\\lang\\JA,ini"; GetPrivateProfileString("Test","test_01","0",str,sizeof(str),ss.c_str()); TntLabel1 -> Caption = str; 結果: TntLabel1上 顯示????? ==================================== JA.ini檔案內容 [Test] test_01=ありがとう test_02=test test_03=顯示結果 ==================================== 不知道版上的先進們是否有解決辦法呢? 目前在讀取utf-8格式的ini檔案 中文字,英文字都沒有問題 但是換到日文字就只會顯示???了 |
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
使用 TMemIniFile
http://stackoverflow.com/questions/16364869/how-do-i-read-a-utf8-encoded-ini-file ===================引 用 cceres 文 章=================== 各位大大好 最近在開發多國語言相關的程式 由於希望可以讓使用者自訂介面的文字 又不希望使用資料庫去紀錄 所以小弟選擇ini檔案來儲存資訊 ==================================== 問題: 我的ini儲存格式使用utf-8 目前不管是寫入ini 或是讀取ini 遇到的日文字皆是??? 但是utf8格式的中文字可以正常讀取與寫入 ==================================== 環境使用 C Bulider 6 並安裝第三方元件:Tnt元件(可顯示unicode之元件) ==================================== 目前打在TntStringGrid上的日文字 可以正常顯示於TntLabel上 寫法: wchar_t *str = TntStringGrid1 -> Cells [1][1]; TntLabel1 -> Caption = str; 讀取ini我試了兩種方式,皆失敗 1. 利用TIniFile 2. 利用GetPrivateProfileString 法1: TInifile *ini; ini = new TIniFile(ExtraFilePath(Application-> ExeName) "\\lang\\JA,ini"); TntLabel1 -> Caption = ini -> ReadString("Test","test_01","QQQQQ"); delete ini; 結果: TntLabel1上 顯示????? 法2: 一樣使用TIniFile 但ReadString回來的東西轉為utf8格式 TIniFile *ini; ini = new TIniFile(ExtraFilePath(Application-> ExeName) "\\lang\\JA,ini"); TntLabel1 -> Caption = ini -> ); delete ini; 結果: TntLabel1上 顯示????? 到這裡發現 似乎是TIniFile只能讀取ansiString格式的字串? 於是小弟找另一個方法去讀取ini檔案: GetPrivateProfileString 法3: char str[20]; AnsiString ss = ExtraFilePath(Application-> ExeName) "\\lang\\JA,ini"; GetPrivateProfileString("Test","test_01","0",str,sizeof(str),ss.c_str()); TntLabel1 -> Caption = str; 結果: TntLabel1上 顯示????? ==================================== JA.ini檔案內容 [Test] test_01=ありがとう test_02=test test_03=顯示結果 ==================================== 不知道版上的先進們是否有解決辦法呢? 目前在讀取utf-8格式的ini檔案 中文字,英文字都沒有問題 但是換到日文字就只會顯示???了 |
cceres
一般會員 發表:2 回覆:7 積分:1 註冊:2016-10-17 發送簡訊給我 |
謝謝大大給我一個方向
一樣的情況 文字讀取進來後日文會變成??? 中文字顯示依舊正常 已測試讀取寫入都無法 是不是我用錯方法了呢? 改為TMemIniFile: ini = new (ExtraFilePath(Application-> ExeName) "\\lang\\JA,ini"); delete ini; ===================引 用 leveon 文 章=================== 使用 TMemIniFile http://stackoverflow.com/questions/16364869/how-do-i-read-a-utf8-encoded-ini-file |
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
ini = new TMemIniFile(ExtraFilePath(Application-> ExeName) "\\lang\\JA,ini",TEncoding::UTF8);
===================引 用 cceres 文 章=================== 謝謝大大給我一個方向 一樣的情況 文字讀取進來後日文會變成??? 中文字顯示依舊正常 已測試讀取寫入都無法 是不是我用錯方法了呢? 改為TMemIniFile: ini = new (ExtraFilePath(Application-> ExeName) "\\lang\\JA,ini"); delete ini; ===================引 用 leveon 文 章=================== 使用 TMemIniFile http://stackoverflow.com/questions/16364869/how-do-i-read-a-utf8-encoded-ini-file
編輯記錄
leveon 重新編輯於 2016-10-17 14:07:05, 註解 無‧
|
cceres
一般會員 發表:2 回覆:7 積分:1 註冊:2016-10-17 發送簡訊給我 |
感謝leveon大大的回答!
我在後面加上TEncoding::UTF8後 會跳出幾個錯誤呢... E2090 Qualifier 'TEncoding' is not a class or namespace name E2293 expected E2285 Could not find a match for 'TMemIniFile::TmemIniFile(AnsiString,undefind)' 是不是需要另外include甚麼header或是我的BCB版本過舊呢 ===================引 用 leveon 文 章=================== ini = new TMemIniFile(ExtraFilePath(Application-> ExeName) "\\lang\\JA,ini",TEncoding::UTF8); |
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
使用XE 以後的版本吧
===================引 用 cceres 文 章=================== 感謝leveon大大的回答! 我在後面加上TEncoding::UTF8後 會跳出幾個錯誤呢... E2090 Qualifier 'TEncoding' is not a class or namespace name E2293 expected E2285 Could not find a match for 'TMemIniFile::TmemIniFile(AnsiString,undefind)' 是不是需要另外include甚麼header或是我的BCB版本過舊呢 ===================引 用 leveon 文 章=================== ini = new TMemIniFile(ExtraFilePath(Application-> ExeName) "\\lang\\JA,ini",TEncoding::UTF8); |
cceres
一般會員 發表:2 回覆:7 積分:1 註冊:2016-10-17 發送簡訊給我 |
|
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
依這篇最後寫的 TMS出的TNT 有 TTNTIniFiles 這個 unit
應可解決這個問題 不然就是用Base64 編碼後再存入 ini 參考看看囉 https://www.experts-exchange.com/questions/26157234/Save-Unicode-string-to-IniFile.html ===================引 用 cceres 文 章=================== 目前專案已經開發的差不多了 要轉移環境不是那麼的容易 而公司有沒有提供新版軟體又是一回事了.. 還是謝謝大大的回答! 我再想想辦法囉 ^^ ===================引 用 leveon 文 章=================== 使用XE 以後的版本吧 |
cceres
一般會員 發表:2 回覆:7 積分:1 註冊:2016-10-17 發送簡訊給我 |
非常非常感謝leveon大大給予參考網址
搞了我四五天的問題終於解決了!!!! 解法: 1.安裝TMS出的TNTUNICODEC6 (最後免費版本無TntIniFile) 2.include TntIniFile.hpp 3.寫法與IniFile一樣 ,但是出入的參數格式使用WideString ===================引 用 leveon 文 章=================== 依這篇最後寫的 TMS出的TNT 有 TTNTIniFiles 這個 unit 應可解決這個問題 不然就是用Base64 編碼後再存入 ini 參考看看囉 https://www.experts-exchange.com/questions/26157234/Save-Unicode-string-to-IniFile.html |
jcjroc
高階會員 發表:21 回覆:279 積分:115 註冊:2002-09-18 發送簡訊給我 |
|
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |