Utf8ToString和旧的Delphi版本

Utf8ToString和旧的Delphi版本,delphi,Delphi,我想在旧版本和新版本的Delphi中使用一些单位。由于最近的Delphi版本,Utf8Decode抛出一个不推荐使用的警告,建议切换到Utf8ToString。问题是旧版本的Delphi没有声明此函数,所以我应该使用哪个{$IFDEF}标签来定义名为Utf8String(或者Utf8ToWideString)的Utf8Decode的包装器 或者换句话说:引入了哪个版本的Utf8ToString?我想我应该使用$IF来实现它,这样调用代码就可以使用新的RTL函数,或者使用旧的不推荐版本。由于新的U

我想在旧版本和新版本的Delphi中使用一些单位。由于最近的Delphi版本,
Utf8Decode
抛出一个不推荐使用的警告,建议切换到
Utf8ToString
。问题是旧版本的Delphi没有声明此函数,所以我应该使用哪个
{$IFDEF}
标签来定义名为
Utf8String
(或者
Utf8ToWideString
)的
Utf8Decode
的包装器


或者换句话说:引入了哪个版本的Utf8ToString?

我想我应该使用
$IF
来实现它,这样调用代码就可以使用新的RTL函数,或者使用旧的不推荐版本。由于新的
UTF8ToString
返回一个UnicodeString,我认为可以安全地假设它是在Delphi2009中引入的

{$IF not Declared(UTF8ToString)}
function UTF8ToString(const s: UTF8String): WideString;
begin
  Result := UTF8Decode(s);
end;
{$IFEND}
据我记忆所及:

  • delphi6中引入了
    UTF8String
    和相关的
    UTF8Encode/UTF8Decode
  • UTF8ToWideString
    UTF8ToString
    在Delphi 2009(即Unicode版本)中引入,如下所示:

    function UTF8Decode(const S: RawByteString): WideString; 
       deprecated 'Use UTF8ToWideString or UTF8ToString';
    
为了消除这个兼容性问题,您可以定义自己的
UTF8ToString
函数(如David建议的),或者使用自己的实现

我为我们的框架重新编写了一些(也许)更快的版本,该版本也适用于Delphi 5(我想添加对一些传统Delphi 5代码的UTF-8支持,使用第三方组件的大约3000000行源代码可以停止轻松升级-至少由经理决定)。请参见所有相应的
RawUTF8
输入:


另一个问题:如果我这样做,我会获得性能吗?'typetutf8decodefunc=function(consts:UTF8String):WideString;变量UTF8ToStringX:TUtf8DecodeFunc;初始化{$IF声明(UTF8ToString)}UTF8ToStringX:=UTF8ToString;{$ELSE}UTF8ToStringX:=UTF8Decode;{$IFEND}`这不会给你带来任何可以衡量的东西
{$ifdef UNICODE}
function UTF8DecodeToString(P: PUTF8Char; L: integer): string;
begin
  result := UTF8DecodeToUnicodeString(P,L);
end;
{$else}
function UTF8DecodeToString(P: PUTF8Char; L: integer): string;
var Dest: RawUnicode;
begin
  if GetACP=CODEPAGE_US then begin
    if (P=nil) or (L=0) then
      result := '' else begin
      SetLength(Dest,L); // faster than Windows API / Delphi RTL
      SetString(result,PAnsiChar(pointer(Dest)),UTF8ToWinPChar(pointer(Dest),P,L));
    end;
    exit;
  end;
  result := '';
  if (P=nil) or (L=0) then
    exit;
  SetLength(Dest,L*2);
  L := UTF8ToWideChar(pointer(Dest),P,L) shr 1;
  SetLength(result,WideCharToMultiByte(GetACP,0,pointer(Dest),L,nil,0,nil,nil));
  WideCharToMultiByte(GetACP,0,pointer(Dest),L,pointer(result),length(result),nil,nil);
end;
{$endif}