全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4068
推到 Plurk!
推到 Facebook!

UNICODE文字檔為何參雜有空白行?

答題得分者是:Stallion
joana
一般會員


發表:35
回覆:70
積分:21
註冊:2005-09-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-06-14 11:18:54 IP:122.124.xxx.xxx 訂閱
我有參考站上資料,從MS SQL2000轉出UNICODE 文字檔,但不知為何分行,有的正常(一行接一行),有的
空一行或空二行,不知如何解決,請各位大德幫幫忙

function WriteWideString2File(filename: string; ws: WideString):Boolean;
const
WideBOM_LSB_First = WideChar(#$FEFF);
var wf: WideString;
f: TFileStream;
i: integer;
begin
Result := false;
wf := WideBOM_LSB_First;
f:= TFileStream.Create(filename, fmCreate);
try
f.Write(wf[1], 2);
for i:= 1 to length(ws) do
f.Write(ws[i], sizeof(ws[i]));
Result := true;
finally
f.Free;
end;

end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var myws: WideString;
begin
myws :='' ;
ADOQuery1.first;
while not ADOQuery1.eof do begin
myws :=myws ADOQuery1['thd_mmrk'] #13#10;
ADOQuery1.next;
end;
WriteWideString2File('c:\in\test.txt', myws);

end;

底下是轉出的UNICODE文字檔



提供類似Adobe 公司的Photoshop, fireworks的圖形處理功能。

存儲空間大小,兼容性等問題而煩惱。兼容性等問題而煩惱。存儲空間大小


中国

中国123ABC储存空间烦恼
編輯記錄
joana 重新編輯於 2007-06-14 11:21:13, 註解 無‧
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-06-15 00:24:00 IP:211.22.xxx.xxx 未訂閱
procedure TForm1.BitBtn1Click(Sender: TObject);
var
myws: WideString;
begin
myws :='' ;
ADOQuery1.first;
While not ADOQuery1.eof do
begin
myws :=myws Trim(ADOQuery1['thd_mmrk']) #13 #10;
ADOQuery1.next;
end;
WriteWideString2File('c:\in\test.txt', myws);
end;

joana
一般會員


發表:35
回覆:70
積分:21
註冊:2005-09-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-06-15 17:36:56 IP:122.124.xxx.xxx 訂閱
謝謝stallion前輩的回覆,但 在WideString 之前加上 trim ,丟到文字檔會變成亂碼耶!
myws :=myws Trim(ADOQuery1['thd_mmrk']) #13 #10;

轉到文字檔之亂碼如下:

提供?似Adobe 公司的Photoshop, fireworks的?形?理功能。
存?空?大小,兼容性等??而??。兼容性等??而??。存?空?大小
包括?Twain ?描?中?得?像(??和多??面)
中?
中?
中?123ABC?存空???

Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-06-15 18:41:23 IP:211.22.xxx.xxx 未訂閱
加上這一行對你的程式應該對你原程式不會有影響,Trim只是單純去除字串頭尾的空白以及控制字元而已,去除後你還是要作文字的編碼轉換啊?
===================引 用 joana 文 章===================
謝謝stallion前輩的回覆,但 在WideString 之前加上 trim ,丟到文字檔會變成亂碼耶!
myws :=myws Trim(ADOQuery1['thd_mmrk']) #13 #10;

轉到文字檔之亂碼如下:

提供?似Adobe 公司的Photoshop, fireworks的?形?理功能。
存?空?大小,兼容性等??而??。兼容性等??而??。存?空?大小
包括?Twain ?描?中?得?像(??和多??面)
中?
中?
中?123ABC?存空???
joana
一般會員


發表:35
回覆:70
積分:21
註冊:2005-09-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-06-16 20:49:56 IP:122.124.xxx.xxx 訂閱
謝謝前輩的回覆,前輩分析的有理,但程式執行後的結果,確是如此,只要加上trim,凡是簡体的字都會變亂碼,
繁體的部份就正常,如果前輩有空也可試試看
原始資料如下

包括从Twain 扫描仪中获得图像(单个和多个页面)
提供类似Adobe 公司的Photoshop, fireworks的图形处理功能。
存储空间大小,兼容性等问题而烦恼。兼容性等问题而烦恼。存储空间大小
包括从Twain 扫描仪中获得图像(单个和多个页面)
或是那裡有可直接將BIG5碼中文字轉為GB碼之unicode ?
如果只考慮轉碼,不考慮繁簡寫法不同的話,可以用下列程式
中国


中国

中国123ABC储存空间烦恼

Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-06-16 21:45:14 IP:211.22.xxx.xxx 未訂閱
procedure TForm1.BitBtn1Click(Sender: TObject);
var myws: WideString;
begin
myws :='' ;
ADOQuery1.first;
while not ADOQuery1.eof do begin
myws :=myws Trim(ADOQuery1['thd_mmrk']) #13#10;

//我目前手邊沒有Unicode的資料表可以測試,不過我之前寫過類似這種主題,ADO原本的物件不支援Unicode,所以TNT才改寫同時也包含 ADOQuery部分,如果我預料沒錯的話,你用Debugger可以看到(不加上Trim),由ADOQuery取出值時,字碼早已經變了,所以看來你 必須使用支援Unicode改寫過的ADO物件。
ADOQuery1.next;
end;
WriteWideString2File('c:\in\test.txt', myws);
end;

joana
一般會員


發表:35
回覆:70
積分:21
註冊:2005-09-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-06-16 22:14:37 IP:122.124.xxx.xxx 訂閱
謝謝前輩的說明,剛做了trace,ADO取出之值是亂碼,但實在不明白,既然是亂碼,為何經過WriteWideString2File('c:\in\test.txt', myws)之函式後,會變正常,但加上TRIM後,會變亂碼?

還有前輩所提到的UNICODE 元件,這個元件是否還是FREE?
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-06-16 22:46:08 IP:211.22.xxx.xxx 未訂閱
1.加上Trim以後為何會變成亂碼我也不知道,按照線上說明Trim是個Overload函數,明明支援WideString。
2.TNT UNICDOE CONTROL現在整套改為TMS了,之前的版本是Free的,現在要付費!去網路上找找看之前的版本吧~不過要注意的是ADOQuery部分是屬於他的Extention(TntEx,其中包含了TntADODB)部分,還有如果你要用到ADOMemo部分也要下載TntWideAdoMemoField,這兩項是與其他TNT Unicode Control分開的。
3.以上TNT的老版本元件,連同Unicode controls以及TntExUpdate部分共有四種,總計3.5MB左右。
===================引 用 joana 文 章===================
謝謝前輩的說明,剛做了trace,ADO取出之值是亂碼,但實在不明白,既然是亂碼,為何經過WriteWideString2File('c:\in\test.txt', myws)之函式後,會變正常,但加上TRIM後,會變亂碼?

還有前輩所提到的UNICODE 元件,這個元件是否還是FREE?
aftcast
站務副站長


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-09-09 03:45:11 IP:60.248.xxx.xxx 訂閱
這題目好像很久了,但很可疑。因本人對於unicode算是有相當的了解,故也想知道是為什麼…

1/
就Trim( )加入後所有簡體都亂碼的問題,我覺得應該是發生在ADOQuery1['thd_mmrk']這個傳回值的型別。因個人不用這個元件,故不知此元件「自動」傳回的型別是string 或是widestring? 我猜應該是string而非widestring!
然而當
myws :=myws ADOQuery1['thd_mmrk'] #13 #10;
沒trim時,它的傳回值會因為 myws是widestring,而動用了 widestring的字串相加方法,進而強制ADOQuery轉為widestring。
但當有trim時,則trim的function會被先計算,而trim本身支持string和widestring,trim會把ADOQuery當string 或是widestring? 也許這就是關鍵! 可能的話不要用自動轉換型別的方式,而手動的把ADOQuery的傳回值定為widestring再trim看看。也許你會問,那繁體為何不會出問題? 應該是本身使用的是繁體windows,而此環境下的ansistring與unicode的繁體都是自動互通的。

2/
另外要說明一下,TADOConnection, command, dataset元件肯定是支持unicode的!!! 這要注意!! 但TADOQuery不清楚,因為…它是borland為了模擬TQuery for bde而包裝的,也許有部份不unicode吧?

3/
為何你trace時看到是亂碼,但存檔是正常的? 因為…你trace的時候應該是在delphi的ide環境下查值/字串,因為delphi的ide是不支持unicode的,你肯定會看到亂碼! 然而你存檔後,你用什麼看值? ultraedit? notepad unicode模式? 對吧? 當然是會看到正常的,因為這些編緝軟體都支持unicode

以上我尚未親身測式,僅就學理上推論,若有人測得因原,也請post上來分享一下。謝謝唷!



===================引 用 joana 文 章===================
謝謝stallion前輩的回覆,但 在WideString 之前加上 trim ,丟到文字檔會變成亂碼耶!
myws :=myws Trim(ADOQuery1['thd_mmrk']) #13 #10;

轉到文字檔之亂碼如下:

提供?似Adobe 公司的Photoshop, fireworks的?形?理功能。
存?空?大小,兼容性等??而??。兼容性等??而??。存?空?大小
包括?Twain ?描?中?得?像(??和多??面)
中?
中?
中?123ABC?存空???




------



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

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