請問delphi7程式放至delphi2010執行的問題(unicode相關) |
答題得分者是:sryang
|
windheartalan
一般會員 發表:21 回覆:23 積分:8 註冊:2005-03-24 發送簡訊給我 |
各位大大好,
我知道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 發送簡訊給我 |
不知道你有什麼因素,要反其道而行
"測試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 發送簡訊給我 |
我是不知道有沒有其他大大有類似的狀況,以我來說,
比方說人家給我一個檔案要我去拆解欄位, 他告訴我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 發送簡訊給我 |
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/ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |