一個TIniFile 的讀取怪狀況 |
缺席
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
請問各位!
以下的部份程式, 主要是利用 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.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
Victor4022
中階會員 發表:0 回覆:76 積分:90 註冊:2011-02-20 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
XE 以前預設存檔的格式都是「ANSI」
一直到XE2後,儲存的預設值才變成「UTF-8」 剛看到一篇處理inifile格式轉換的文章,PD大可以參考看看: http://forum.cnsec.org/thread-79006-1-1.html |
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
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 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
嗯,是會自動測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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |