線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1782
推到 Plurk!
推到 Facebook!

utf-8格式 .ini檔案,讀取與寫入

答題得分者是:leveon
cceres
一般會員


發表:2
回覆:7
積分:1
註冊:2016-10-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2016-10-17 09:56:56 IP:1.161.xxx.xxx 訂閱
各位大大好
最近在開發多國語言相關的程式
由於希望可以讓使用者自訂介面的文字
又不希望使用資料庫去紀錄
所以小弟選擇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 -> Utf8ToAnsi(ReadString("Test","test_01","QQQQQ"));
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
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2016-10-17 10:01:11 IP:1.164.xxx.xxx 訂閱
使用 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 -> Utf8ToAnsi(ReadString("Test","test_01","QQQQQ"));
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2016-10-17 10:38:53 IP:1.161.xxx.xxx 訂閱
謝謝大大給我一個方向
一樣的情況 文字讀取進來後日文會變成???
中文字顯示依舊正常
已測試讀取寫入都無法

是不是我用錯方法了呢?
改為TMemIniFile:
TMemIniFile ini = new TMemIniFileTntLabel1 -> Caption = ini -> ReadString("Test","test_01","QQQQQ");
delete ini;

===================引 用 leveon 文 章===================
使用 TMemIniFile

http://stackoverflow.com/questions/16364869/how-do-i-read-a-utf8-encoded-ini-file


編輯記錄
cceres 重新編輯於 2016-10-17 10:50:58, 註解 無‧
cceres 重新編輯於 2016-10-17 11:44:48, 註解 無‧
leveon
資深會員


發表:30
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2016-10-17 14:05:59 IP:1.164.xxx.xxx 訂閱
ini = new TMemIniFile(ExtraFilePath(Application-> ExeName) "\\lang\\JA,ini",TEncoding::UTF8);


===================引 用 cceres 文 章===================
謝謝大大給我一個方向
一樣的情況 文字讀取進來後日文會變成???
中文字顯示依舊正常
已測試讀取寫入都無法

是不是我用錯方法了呢?
改為TMemIniFile:
TMemIniFile ini = new TMemIniFileTntLabel1 -> Caption = ini -> ReadString("Test","test_01","QQQQQ");
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2016-10-17 14:20:51 IP:1.161.xxx.xxx 訂閱
感謝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
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2016-10-17 14:30:44 IP:1.164.xxx.xxx 訂閱
使用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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2016-10-17 14:35:55 IP:1.161.xxx.xxx 訂閱
目前專案已經開發的差不多了
要轉移環境不是那麼的容易
而公司有沒有提供新版軟體又是一回事了..
還是謝謝大大的回答!
我再想想辦法囉 ^^

===================引 用 leveon 文 章===================
使用XE 以後的版本吧
leveon
資深會員


發表:30
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2016-10-17 15:09:53 IP:1.164.xxx.xxx 訂閱
依這篇最後寫的 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2016-10-18 12:22:03 IP:1.161.xxx.xxx 訂閱
非常非常感謝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
回覆:276
積分:114
註冊:2002-09-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2016-10-19 09:41:05 IP:210.61.xxx.xxx 訂閱
API 只要牽涉字串,95%以上都有A & W兩種
我寫程式不喜歡由Compiler setting來決定是不是Unicode
工程師應該能明確知道目前需求而決定API 到底應該用A 還是W
leveon
資深會員


發表:30
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2016-10-19 09:55:45 IP:1.161.xxx.xxx 訂閱
BCB 6 可以 setting Compiler 來決定是不是Unicode?
在哪邊 setting ?
===================引 用 jcjroc 文 章===================
API 只要牽涉字串,95%以上都有A & W兩種
我寫程式不喜歡由Compiler setting來決定是不是Unicode
工程師應該能明確知道目前需求而決定API 到底應該用A 還是W
系統時間:2017-11-22 11:46:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!