2014-03-06 159 views
4

我有公司的RAD Studio xe5 我用印EncodeString用於編碼輸入字符串...base64編碼爲UTF-8字符串

我的代碼是這樣的:

procedure TForm5.Button2Click(Sender: TObject); 
var 
    UTF8: UTF8String; 
begin 
UTF8 := UTF8Encode(m1.Text); 
m2.Text := ind.EncodeString(UTF8); 
end; 

但輸出是錯誤的對於UTF-8輸入

orange --> b3Jhbmdl [correct] 
book --> Ym9vaw== [correct] 
سلام --> Pz8/Pw== [wrong] 
کتاب --> Pz8/Pw== [wrong] 
دلفی --> Pz8/Pw== [wrong] 

對於utf-8的所有輸入它返回相同輸出! 我的代碼有什麼問題,我怎樣才能得到一個很好的結果與utf-8字符串base64編碼

+0

你印地使用比​​BASE64其他? –

+1

即時通訊使用indy和問題修復,剛剛閱讀接受的答案 –

+0

我的觀點是,人們經常使用Indy只是爲base64,並有一個更清楚的方式來獲得base64比使用Indy。當然,如果你使用Indy,那麼它的base64代碼是一個很好的調用。 –

回答

7

像@RRUZ說,EncodeString()期望你指定一個字節編碼,該輸入String將被轉換爲,然後那些八位字節將被編碼爲base64。

你傳遞一個UTF8StringEncodeString(),這需要一個UnicodeString在XE5輸入,因此RTL將UTF8String數據轉換回UTF-16,解開自己的UTF8Encode()(它被廢棄了,順便說一句)。由於您沒有指定字節編碼,因此Indy使用其默認編碼,默認設置爲ASCII(可通過IdGlobal單元中的GIdDefaultTextEncoding變量進行配置)。

這就是爲什麼orange工作(沒有數據丟失),但سلام失敗(數據丟失)。

你需要得到完全擺脫你UTF8String的,讓印處理UTF-8爲您提供:

procedure TForm5.Button2Click(Sender: TObject); 
begin 
    m2.Text := TIdEncoderMIME.EncodeString(m1.Text, IndyTextEncoding_UTF8); 
end; 

DecodeString()有指定一直base64編碼的八位字節的字節編碼一個類似的參數。輸入被首先解碼爲字節,然後將字節用指定的字節編碼轉換爲UnicodeString,例如:

procedure TForm5.Button3Click(Sender: TObject); 
begin 
    m1.Text := TIdDecoderMIME.DecodeString(m2.Text, IndyTextEncoding_UTF8); 
end; 
4

您必須調用EncodeString方法傳遞一個適當的字節編碼類。

嘗試此

m2.Text := TIdEncoderMIME.EncodeString(UTF8, IndyUTF8Encoding); 

(IndyUTF8Encoding在IdGlobal單元定義)

+4

首先不要將源'String'分配給'UTF8String'。將它原樣傳遞給EncodeString(),讓Indy在內部將字符串轉換爲UTF-8之前,將它們編碼爲base64:m2.Text:= TIdEncoderMIME.EncodeString(m1.Text,IndyUTF8Encoding); '。如果你使用的是D2007或更早的版本,'EncodeString()'帶有一個額外的參數,可以指定'String'的Ansi編碼,這樣'EncodeString()'可以正確地將它轉換爲UTF-8。此外,在Indy 10.6中,IndyUTF8Encoding已被替換爲IndyTextEncoding_UTF8。 –

1

對於RadStudio10 C++

#include <IdGlobal.hpp> String my_str = L"Շնորհակալություն"; String str = IdEncoderMIME1->EncodeString(my_str ,IndyTextEncoding_UTF8()); my_str = IdDecoderMIME1->DecodeString(str ,IndyTextEncoding_UTF8());