2016-07-15 13 views
1

Я ищу кодировку строковой переменной для UTF-16LE и base64, проблема в том, что я ничего не знаю о том, как делать UTF-16LE в Delphi.Кодировать строковую переменную в UTF-16LE base64 с помощью Delphi

Пример в Python:

from base64 import b64encode 
b64encode('my text'.encode('UTF-16LE')) 

Пример в Ruby:

require "base64" 
Base64.encode64('my text'.force_encoding('UTF-16LE')) 

Как я могу сделать это в Delphi?

Обновлено:

procedure TFormTest.btnTestClick(Sender: TObject); 
var 
    dest, src: TEncoding; 
    srcBytes, destBytes: TBytes; 
    Encoder: TIdEncoderMime; 
begin 
    Encoder := TIdEncoderMime.Create(nil); 
    src := TEncoding.Unicode; 
    srcBytes := src.GetBytes(Edit1.Text); 
    Edit2.Text := Encoder.EncodeBytes(srcBytes); 
    FreeAndNil(Encoder); 

end; 

Создан действующий base64 UTF-16LE?

Powershell говорит мне, что недопустим

Команда для использования:

(New-Object System.Net.WebClient).DownloadFile('http://localhos/update_program.exe','updater.exe'); Start-Process 'updater.exe' 

Ошибка выхода:

Missing expression after unary operator '-'. 
+1

В версиях Delphi 2009 и выше строки ** являются ** в UTF-16LE , Вам нужен метод для кодирования B64. Вероятно, вы можете найти что-то в одном из подразделений Indy. –

+1

Delphi является малоподвижным, а UTF-16LE - по умолчанию для Delphi для строк. – kludg

+0

'TEncoding.Unicode.GetBytes (str)' для кодирования как UTF-16LE. Затем используйте один из многих кодеров base64. Попробуйте некоторые веб-поиска. –

ответ

2

То, что вы показали технически правильно. Сначала String сначала кодируется в массив байтов UTF-16LE, а затем байты получают кодировку base64.

Поскольку вы вызываете TIdEncoderMIME.Create() создать экземпляр объекта, вы должны использовать метод Encode() экземпляра вместо статического метода EncodeBytes() (что создает еще один экземпляр внутренне):

procedure TFormTest.btnTestClick(Sender: TObject); 
var 
    Encoder: TIdEncoderMIME; 
begin 
    Encoder := TIdEncoderMIME.Create(nil); 
    // prior to Indy 10.6.0, use TIdTextEncoding.Unicode 
    // instead of IndyTextEncoding_UTF16LE... 
    Edit2.Text := Encoder.Encode(Edit1.Text, IndyTextEncoding_UTF16LE); 
    Encoder.Free; 
end; 

Что можно упростить дальнейшее использование EncodeString() статический метод:

procedure TFormTest.btnTestClick(Sender: TObject); 
begin 
    // prior to Indy 10.6.0, use TIdTextEncoding.Unicode 
    // instead of IndyTextEncoding_UTF16LE... 
    Edit2.Text := TIdEncoderMIME.EncodeString(Edit1.Text, IndyTextEncoding_UTF16LE); 
end; 

Но так или иначе, выход все равно. Поэтому любая проблема, с которой вы все еще сталкиваетесь, должна быть в другом месте. Но вы не указали какие-либо сведения о том, как вы проверяете данные, какие инструменты отклоняют их, какие сообщения действительно сообщаются и т. Д.

+0

спасибо за помощь, что версия delphi начинает появляться «IndyTextEncoding_UTF16LE»? , потому что я вызываю блок IdGlobal, но «IndyTextEncoding_UTF16LE» отсутствует –

+0

@MattOlsen он был добавлен в Indy 10.6.0.0 (поставляется с XE4), когда ['TIdTextEncoding' был заменен на' IIdTextEncoding'] (http://indyproject.org) /Sockets/Blogs/ChangeLog/20130423.aspx). Вы можете обновить XE2 до последней версии Indy или просто использовать 'TIdTextEncoding.Unicode' вместо' IndyTextEncoding_UTF16LE'. –

+0

@RemyLebeau: 'FreeAndNil', честно? «Encoder» покинет область сразу после этого, поэтому нет необходимости указывать ссылку. –