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