TEncoding & TNetEncoding(使用现成的TBase64Encoding,TEncoding和TMBCSEncoding)

TEncoding and TNetEncoding are abstract classes and you will never instantiate one of them, because only the descendants will have the full functionality. Normally you would need to write something like this...

Code:

var
  Encoding: TEncoding
  Buffer: TArray<Byte>;
begin
  Encoding := TMBCSEncoding.Create(GetACP, 0, 0);
  try
    Buffer := Encoding.GetBytes(‘Hello world!‘);
    (...)
  finally
    Encoding.Free();
  end;
end;

...and you get the ANSI values for "Hello world!". But this isn‘t really funny and bloates the code, therefore often used Encodings like ASCII, ANSI, UTF8 and other are implemented as Singleton. Therefore the using is normally something like this...

Code:

var
  Buffer: TArray<Byte>;
begin
  Buffer := TEncoding.ANSI.GetBytes(‘Hello world!‘);
  (...)
end;

In this case the RTL holds and manages an instance of an ANSI encoding object and you will always get the same object. Now sometimes it‘s needed to work with other code pages and for this cases the function "GetEncoding(...)" exists. You will use it in this way...

Code:

var
  Encoding: TEncoding;
  Buffer: TArray<Byte>;
begin
  Encoding := TEncoding.GetEncoding(852);
  try
    Buffer := Encoding.GetBytes(‘Hello‘);
    (...)
  finally
    Encoding.Free();  <- must have
  end;
end;

Note: You need to destroy such instances by your own. In case you use often the same code page, just use a global variable, otherwise use it like any other class too.

The class TNetEncoding has the same schema as TEncoding is using. It is an abstract class which offers with the properties Base64, HTML and URL certain encoder. Even the class TBase64Encoding has an overloaded constructor, which allows to tweak the output. In the example below is the "LineSeparator" empty and therefore the output has not line breaks, which is far away from what default behaviour offers.

Code:

class function TEncodingUtils.BytesToBase64(Buffer: PByte; const Offset, Count: Integer): string;
var
  Encoder: TBase64Encoding;
  Input: PByte;
begin
  Encoder := TBase64Encoding.Create(MaxInt, ‘‘);
  try
    Input := Buffer;
    Inc(Input, Offset);
    Result := Encoder.EncodeBytesToString(Input, Count);
  finally
    Encoder.Free();
  end;
end;

https://www.board4allcz.eu/showthread.php?t=634856

时间: 2024-10-12 03:15:53

TEncoding & TNetEncoding(使用现成的TBase64Encoding,TEncoding和TMBCSEncoding)的相关文章

TEncoding

#include <tchar.h> #include <memory> //For STL auto_ptr class //--------------------------------------------------------------------------- #pragma argsused int _tmain(int argc, _TCHAR* argv[]) { // Sample to convert a file of any encoding to

kbmmw 做REST 服务签名认证的一种方式

一般对外提供提供REST 服务,由于信息安全的问题, 都要采用签名认证,今天简单说一下在KBMMW 中如何 实现简单的签名服务? 整个签名服务,模仿阿里大鱼的认证方式,大家可以根据实际情况自己修改. 没有太多的解释,直接上马 [kbmMW_Rest('method:get, path:getwithcheck')] [kbmMW_Method] function getwithcheck( [kbmMW_Rest('value: "$p1", required: true')] con

Delphi WebBrowser控件的使用(大全 good)

Delphi WebBrowser控件的使用 WebBrowser控件属性:1.Application      如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDispatch).如果在宿主对象中自动化对象无效,程序将返回WebBrowser控件的自动化对象2.Parent       返回WebBrowser控件的父自动化对象,通常是一个容器,例如是宿主或IE窗口3.Containe       返回WebBrowser控件容器的自动化对象.通常该值与Pare

delphi中webbrowser的用法

WebBrowser1.GoHome; //到浏览器默认主页 WebBrowser1.Refresh; //刷新 WebBrowser1.GoBack; //后退 WebBrowser1.GoForward; //前进 WebBrowser1.Navigate('...'); //打开指定页面 WebBrowser1.Navigate('about:blank'); //打开空页面 //打开空页面, 并写入... WebBrowser1.Navigate('about:<head><ti

FMX Android ZIP解压中文乱码

在手机上解压了一个WINDOWS上的压缩文件, 发现中文是乱码的,解决方法如下: 找到System.zip.pas文件 将E := TEncoding.GetEncoding(437);   改为 E := TEncoding.GetEncoding(936); 保存后新建多平台项目,添加此文件后重新编译, 编译此项目,将System.zip.dcu和System.zip.so两个文件, 分别覆盖到DELPHI的安装目录下\lib\android\release,以及\lib\android\d

CPU的最小执行单位是线程,协程不需要qt支持...直接用现成的协程库就行了

协程也就在I/O操作上才有优势,Qt事件循环,本事很多I/O已经是异步了,利用好异步(虽然都说异步有点反人类思维).因为CPU的执行最小单位是线程,协程也只是在其之上又调度而已. 我的意思是利用好异步的优势.协程是程序级别的调度,对于CPU执行来说,没任何优势的. CPU的最小执行单位是线程,单线程里十万个协程,也就一个在工作,利用不了并行优势.对于高运算的程序,协程除了增加调度开销并没有优势的.对于I/O操作较多的程序才有用,因为I/O太慢.而对应I/O操作,异步相对与协程开销更小,效率也更高

iOS 国际化最新最全教程+如何快速国际化一个现成APP

同学面试时遇到一个问题,面试官问他,有一个现成的APP马上要上线了,怎么在不改原来代码,也不改xib.storyboard的情况下快速实现国际化.这里应同学请求写下此教程.反正国际化的步骤都要搞一遍,干脆写一个详细.全面的教程. 一.配置国际化语言 点击progect->info->localizations下的'+',选择你要支持的语言,默认支持英文,如下图 二.应用名称国际化 新建一个Strings File类型的文件,且名称必须为InfoPlist. 选中刚刚新建的文件,在Xcode的右

EF4.1DbContext使用现成的数据库

在配置文件中使用 <configuration> <connectionStrings> <add name="BlogDB" providerName="System.Data.SqlClient" connectionString="Data Source=.\sqlexpress;Initial Catalog=MyBlogDB;Integrated Security=True"/> </conne

380T交易所现成的交易系统开发公司

380T数字资产交易所平台(www.38tjys.com)是一家专业做虚拟币交易系统的互联网软件公司,为客户提供优质的产品和服务,本平台系统功能丰富,确保系统的稳定性和安全性,强大实用.我们的平台是类似于[聚币网]之类的交易平台系统.不了解的也可以去多多参考. 数字货币可分为三大类:第一类是大家熟悉的游戏币.第二类是门户网站或者即时通讯工具服务商发行的专用货币,用于购买本网站内的服务.第三类互联网上的虚拟货币,如比特币(BTC).莱特货币(LTC).福源币(FTC)等,比特币是一种由开源的P2P