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

一個TIniFile 的讀取怪狀況

缺席
P.D.
版主


發表:571
回覆:3880
積分:3666
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-03-18 23:21:28 IP:118.169.xxx.xxx 未訂閱
請問各位!
以下的部份程式, 主要是利用 TIniFile 來讀取一支 ini 檔案,
本來都好好的可以讀到資料, 但吃完飯回來再run, 竟然怎麼樣都讀不到了,
試了好幾個小時, 也嘗試所能想到的各種方式, 但仍告無效, 請各位看看能不能找到端倪
SQLdef 是一個 Record 的定義
Settingini: TIniFile;
Edit1.Text:= 'd:\test\test.ini'
test.ini檔確實存在, 電腦也沒中毒沒任何異狀, 也重開機過, 也曾把 Edit1.txt 直接替換成 'd:\test\test.ini',
也曾取消 SQLdef, 改用獨立的變數指定
我使用的是 DelphiXE2 update 4

test.ini
[SQLSOURCE]
DriverType = FBConnection
GetDriverFunc = getSQLDriverINTERBASE
LibraryName = dbxfb.dll
VendorLib = fbclient.dll
DriverName = FireBird
LoginName = sysdba
LoginPass = masterkey

謝謝!

SettingIni:= TIniFile.Create(Edit1.Text);
with SQLdef do begin
DriverType := SettingIni.ReadString('SQLSOURCE','DriverType','');
GetDriverFunc := SettingIni.ReadString('SQLSOURCE','GetDriverFunc','');
LibraryName := SettingIni.ReadString('SQLSOURCE','LibraryName','');
VendorLib := SettingIni.ReadString('SQLSOURCE','VendorLib','');
DriverName := SettingIni.ReadString('SQLSOURCE','DriverName','');
LoginName := SettingIni.ReadString('SQLSOURCE','LoginName','');
LoginPass := SettingIni.ReadString('SQLSOURCE','LoginPass','');
ConnectString := SettingIni.ReadString(DriverType,'ConnectionString','');
end;
SettingIni.Free;

編輯記錄
P.D. 重新編輯於 2012-03-18 09:23:04, 註解 無‧
P.D.
版主


發表:571
回覆:3880
積分:3666
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-03-18 23:29:38 IP:118.169.xxx.xxx 未訂閱
實在很抱歉, 發完後, 我發現一件事
不知道什麼時候, test.ini 存檔的格式竟然變成 UTF-8, 改成 ANSI 就好了
Victor4022
中階會員


發表:0
回覆:76
積分:90
註冊:2011-02-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-04-21 09:31:16 IP:59.115.xxx.xxx 訂閱
小弟在 Delphi7 轉 Delphi2009 程式上發現可以用 TMemIniFile class,其中一個建構子可以支援 Encoding: TEncoding 參數
就能解決 ini file 編碼問題


===================引 用 P.D. 文 章===================
實在很抱歉, 發完後, 我發現一件事
不知道什麼時候, test.ini 存檔的格式竟然變成 UTF-8, 改成 ANSI 就好了
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-04-26 09:21:05 IP:59.120.xxx.xxx 訂閱
XE 以前預設存檔的格式都是「ANSI」

一直到XE2後,儲存的預設值才變成「UTF-8」

剛看到一篇處理inifile格式轉換的文章,PD大可以參考看看:
http://forum.cnsec.org/thread-79006-1-1.html
sryang
尊榮會員


發表:38
回覆:741
積分:875
註冊:2002-06-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2013-04-13 14:30:17 IP:114.35.xxx.xxx 訂閱
TMemIniFile 支援偵測 BOM (byte order mark)

只要 INI 檔有 BOM (ANSI 格式的無法加入 BOM)

無論是 UTF-8, UTF-16 LE, UTF16 BE 都可以正常讀寫

無須在 TMemIniFile.Create 時加入第二個參數指定 Encoding
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2013-04-14 16:14:53 IP:114.32.xxx.xxx 訂閱
tinifile 我在 xe 與 xe3 下都是以  ansi 編碼的file儲存,並不是utf8。

xe2 不同? (我沒xe2)

只是tinifile裡的字串內容無法存入utf16的字串。(不過這也是正常的,因為檔案內容都編成ansi了)。

===================引 用 GrandRURU 文 章===================
XE 以前預設存檔的格式都是「ANSI」

一直到XE2後,儲存的預設值才變成「UTF-8」

剛看到一篇處理inifile格式轉換的文章,PD大可以參考看看:
http://forum.cnsec.org/thread-79006-1-1.html
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2013-04-14 16:24:41 IP:114.32.xxx.xxx 訂閱
嗯,是會自動測BOM,若無BOM就是會被當成ansi來處理。

但,為了「第一次」寫入ini file時整個檔案被編成utf16或是utf8等,還是一定要設定第二參數。這樣有二個義意:
1/ 會被加入BOM的資訊
2/ 內容會被編成指定的編碼 (即不會是預設的ansi)

然而,若「第二次以上開檔」或是原來的ini檔就含有BOM(可能是你用別的文字編輯器打的內容),那麼就可以不用有第二參數!

不過,個人覺得有加入第二參數會比較一致性,除非的除非該ini檔一開始就在外面建立好,但即使是如此,萬一該檔不見了,依create 的特性,會再建立一個,於是就若無第二參數,那麼就無法存入utf16/utf8等的字串了 (會變ansi)。

以上情形在tmemo之save 與 load也是一樣的規則。

===================引 用 sryang 文 章===================
TMemIniFile 支援偵測 BOM (byte order mark)

只要 INI 檔有 BOM (ANSI 格式的無法加入 BOM)

無論是 UTF-8, UTF-16 LE, UTF16 BE 都可以正常讀寫

無須在 TMemIniFile.Create 時加入第二個參數指定 Encoding
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
系統時間:2017-10-19 5:50:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!