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

請問delphi7程式放至delphi2010執行的問題(unicode相關)

答題得分者是:sryang
windheartalan
一般會員


發表:21
回覆:23
積分:8
註冊:2005-03-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-05-21 11:18:10 IP:122.146.xxx.xxx 訂閱
各位大大好,
我知道delphi2010有支援unicode,很多method本來預設為string的部份,也都改為unicodestring,

問題來了,想請教大家,
如果我是根據Caption,Text,或是StringList的strings去取字串值,
現在都變成回傳unicodestring了,

我本來會根據這些字串值去切割,取得我要的部份,比方說總長度60,取1~20,21-30,31~60等,
但現在變成unicodestring回傳後,如果裡面含中文,會導致我使用substring時,位置抓錯,
比方說"測試123"這字串,以前取substring(1,4),拿到的會是"測試",
但在2010會變成"測試12",導致後續判斷的問題,

想請問大家,針對這類的狀況,是怎麼處理的呢?
因為我有些字串值,必須透過Caption,Text,或是StringList的strings去取得,
以StringList來說,現在各method的回傳型態都是unicodestring,

目前我的處理方式是,另外設定一個Ansistring來接,
unicodestring中有一個t_str function可轉回AnsiString,再用AnsiString來做切割,
是只能這樣做嗎? 還是有其他更好的方法? 感謝大家的指教.

syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-05-24 09:14:36 IP:59.120.xxx.xxx 訂閱
不知道你有什麼因素,要反其道而行

"測試123"這字串,以前取substring(1,4),拿到的會是"測試",
2010會變成"測試12"

這很正常,有應該是這樣,以前取1個字,要用數字 2 ,這讓人覺得不自然,不直覺,今天,只要用 1,反而讓你困擾,這倒是奇特

"測試123" --> substring(1,2) --> 拿到的會是"測試" 2 個字
"測試123" --> substring(1,3) --> 拿到的會是"測試1" 3 個字
"測試123" --> substring(1,4) --> 拿到的會是"測試12" 4 個字

不用管中英文,只管要幾個字,這樣不是很直覺嗎?

===================引 用 windheartalan 文 章===================
各位大大好,
我知道delphi2010有支援unicode,很多method本來預設為string的部份,也都改為unicodestring,

問題來了,想請教大家,
如果我是根據Caption,Text,或是StringList的strings去取字串值,
現在都變成回傳unicodestring了,

我本來會根據這些字串值去切割,取得我要的部份,比方說總長度60,取1~20,21-30,31~60等,
但現在變成unicodestring回傳後,如果裡面含中文,會導致我使用substring時,位置抓錯,
比方說"測試123"這字串,以前取substring(1,4),拿到的會是"測試",
但在2010會變成"測試12",導致後續判斷的問題,

想請問大家,針對這類的狀況,是怎麼處理的呢?
因為我有些字串值,必須透過Caption,Text,或是StringList的strings去取得,
以StringList來說,現在各method的回傳型態都是unicodestring,

目前我的處理方式是,另外設定一個Ansistring來接,
unicodestring中有一個t_str function可轉回AnsiString,再用AnsiString來做切割,
是只能這樣做嗎? 還是有其他更好的方法? 感謝大家的指教.

windheartalan
一般會員


發表:21
回覆:23
積分:8
註冊:2005-03-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-05-26 14:35:37 IP:59.120.xxx.xxx 訂閱
我是不知道有沒有其他大大有類似的狀況,以我來說,
比方說人家給我一個檔案要我去拆解欄位,
他告訴我1~10是名字,11~20是帳號,21~30是密碼等,

依照之前作法,我只要取得整行字串,然後去取substr(1,10),substr(11,10),substr(21,10),就可以拿到我要的值,
但現在unicodestring的狀況,只要名字有中文,
使用上述的作法,就會抓錯位置,因為以unicode的角度來說,固定給的30字元長度,
會因為中文字數的多寡,使得實際unicodestring的長度變成29,28,27....等,
如此一來,我就不能取得正確的值,

而舉例來說,名字跟帳號長度本身有可能變化,所以我是不能固定抓3碼代表名字之類的作法,
一般是擷取固定子字串後,再去做trim的動作,

不知道這樣syntax大大能否知道我為何這麼做的原因,
當然也許有更好的方法,就請提供建議囉...

===================引 用 syntax 文 章===================
不知道你有什麼因素,要反其道而行

"測試123"這字串,以前取substring(1,4),拿到的會是"測試",
2010會變成"測試12"

這很正常,有應該是這樣,以前取1個字,要用數字 2 ,這讓人覺得不自然,不直覺,今天,只要用 1,反而讓你困擾,這倒是奇特

"測試123" --> substring(1,2) --> 拿到的會是"測試" ? 2 個字
"測試123" --> substring(1,3) --> 拿到的會是"測試1" ? 3 個字
"測試123" --> substring(1,4) --> 拿到的會是"測試12" ? 4 個字

不用管中英文,只管要幾個字,這樣不是很直覺嗎?

===================引 用 windheartalan 文 章===================
各位大大好,
我知道delphi2010有支援unicode,很多method本來預設為string的部份,也都改為unicodestring,

問題來了,想請教大家,
如果我是根據Caption,Text,或是StringList的strings去取字串值,
現在都變成回傳unicodestring了,

我本來會根據這些字串值去切割,取得我要的部份,比方說總長度60,取1~20,21-30,31~60等,
但現在變成unicodestring回傳後,如果裡面含中文,會導致我使用substring時,位置抓錯,
比方說"測試123"這字串,以前取substring(1,4),拿到的會是"測試",
但在2010會變成"測試12",導致後續判斷的問題,

想請問大家,針對這類的狀況,是怎麼處理的呢?
因為我有些字串值,必須透過Caption,Text,或是StringList的strings去取得,
以StringList來說,現在各method的回傳型態都是unicodestring,

目前我的處理方式是,另外設定一個Ansistring來接,
unicodestring中有一個t_str function可轉回AnsiString,再用AnsiString來做切割,
是只能這樣做嗎? 還是有其他更好的方法? 感謝大家的指教.

sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-05-27 22:30:46 IP:124.8.xxx.xxx 訂閱
windheartalan 轉成 AnsiString 再 Copy 的作法,在遇到檔案中有非 BIG5 碼範圍的中文字時,會變成問號,那一筆資料就歸組壞光光
個人的經驗是,用 TEncoding.GetEncoding(54936).GetByte() 取得那一個字串的 GB18030 編碼的 byte array
然後取需要的長度,再使用 TEncoding.GetEncoding(54936).GetString() 轉回 UnicodeString
使用 GB18030 的原因,是因為 GB18030 包含了 Unicode 範圍的所有中文字
[code delphi]
function OldCopy(AStr: string; AStart, ALength: integer): string;
var buffer: TBytes;
begin
// 先轉換成指定字碼頁的 byte array,字碼頁 54936 = GB18030
// 不用 950(BIG5)的原因是 GB18030涵蓋了所有的正體、簡體中文字
buffer := TEncoding.GetEncoding(54936).GetBytes(AStr);
// 再取需要長度,轉回 string
Result := TEncoding.GetEncoding(54936).GetString(buffer,
AStart - 1, ALength);
end;
[/code]

------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
編輯記錄
sryang 重新編輯於 2010-05-27 22:31:40, 註解 無‧
sryang 重新編輯於 2010-05-27 22:32:33, 註解 無‧
系統時間:2024-04-26 12:15:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!