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

Delphi 2010 有關 Unicode 字串 的 Base64 編碼問題

答題得分者是:sryang
boson
中階會員


發表:74
回覆:155
積分:85
註冊:2004-07-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-04-30 16:23:06 IP:114.33.xxx.xxx 訂閱
我使用 Delphi 2010 , 想要對一個 Unicode 字串進行 Base64 編碼,
我直接使用 Delphi 內建的 EncdDecd 單元

[code delphi]

uses EncdDecd;

procedure TForm1.Button1Click(Sender: TObject);
var
S:string;
begin
S:=EncodeString('游錫堃');
S:=DecodeString(S);
Edit1.Text:=S;
end;
[/code]

將 '游錫堃' 字串編碼後, 再解碼, 結果得到的值卻是 '游錫?' , 堃字沒有正確解碼

這是哪裏出問題 ?


sryang
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-05-01 08:53:11 IP:124.10.xxx.xxx 訂閱
我用你的程式碼來嘗試,得到一樣的結果,於是我嘗試去追蹤 EncodeSting 與 DecodeString
發現 EncodeSting 的第一行就掛了
他用 InStr := TStringStream.Create(Input); 得到的 InStr 內容是 (180, 229, 191, 252, 63)
怎麼會只有 5 個 byte?最後一個 byte 63 不就是 "?" 嗎?

所以,我把 EncdDecd 的 source code 另存新檔,嘗試以指定編碼的方式來修改看看。
發覺只要在 EncodeSting 中的 InStr := TStringStream.Create(Input); 這一行
以及 DecodeString 中的 OutStr := TStringStream.Create(''); 這一行
指定相同的編碼,就可以得到正確的結果

所以我修改了 EncodeSting 以及 DecodeString 如下:
(引用另存新檔的 EncdDecd1 而不是原來的 EncdDecd )
[code delphi]
function EncodeString(const Input: string; Encoding: TEncoding): string;
var
InStr, OutStr: TStringStream;
begin
InStr := TStringStream.Create(Input, Encoding);
try
OutStr := TStringStream.Create('');
try
EncodeStream(InStr, OutStr);
Result := OutStr.DataString;
finally
OutStr.Free;
end;
finally
InStr.Free;
end;
end;

function DecodeString(const Input: string; Encoding: TEncoding): string;
var
InStr, OutStr: TStringStream;
begin
InStr := TStringStream.Create(Input);
try
OutStr := TStringStream.Create('', Encoding);
try
DecodeStream(InStr, OutStr);
Result := OutStr.DataString;
finally
OutStr.Free;
end;
finally
InStr.Free;
end;
end;
[/code]
而樓主的程式改成
[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
var
S:string;
begin
S:=EncodeString('游錫堃', TEncoding.Unicode);
S:=DecodeString(S, TEncoding.Unicode);
Edit1.Text:=S;
end;
[/code]
這樣就 OK 了
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
系統時間:2024-11-22 4:36:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!