gpt4 book ai didi

delphi - TRestClient Delphi XE5中对UTF-8编码字符串的支持

转载 作者:行者123 更新时间:2023-12-03 15:25:17 24 4
gpt4 key购买 nike

我想使用 Delphi XE5 中的新 Trest 组件发送推文。我正在寻找一种方法对包含 IS0-8859-1 字符的推文进行 UTF8 编码。下面的代码可以工作,但涉及代码页转换等。是更好的方法吗?有人吗?

procedure TTwitterApi.Send(Tweet: string);
begin
Reset;

// Encode as UTF8 within (UTF-16 Delphi) string
Tweet := EncodeAsUTF8(Tweet);

FRestRequest.Resource := '1.1/statuses/update.json';
FRestRequest.Method := rmPOST;
FRestRequest.Params.AddItem('status', Tweet, pkGETorPOST);
FRestRequest.Execute;
end;


function TTwitterApi.EncodeAsUTF8(UnicodeStr: string): string;
var
UTF8Str: AnsiString;
TempStr: RawByteString;
begin
TempStr := UTF8Encode(UnicodeStr);
SetLength(UTF8Str, Length(TempStr));
Move(TempStr[1], UTF8Str[1], Length(UTF8Str));
Result := UTF8Str;
end;

最佳答案

推特的1.1/statuses/update.json URL 期望数据编码为 application/x-www-form-urlencoded格式,所以需要设置TRESTClient.ContentType属性至ctAPPLICATION_X_WWW_FORM_URLENCODED (默认设置为 ctNone)。

对于 UTF-8,TRESTClient在内部使用 Indy,并且 Indy 支持使用用户指定的字符集对出站数据进行编码,但 Embarcadero 似乎并未将该功能添加到其 TRESTClient 中。接口(interface)(不过它确实处理响应中的字符集)。我不知道为什么 Embarcadero 会省略这么重要的功能。仅将字符串数据编码为 UTF-8 是不够的(顺便说一句,您没有正确执行此操作),您还必须告诉 Twitter 该数据已经过 UTF-8 编码(通过 charset 属性) Content-Type REST header ),以及 TRESTClient据我所知,不允许你这样做。不知道是不是TRESTClient发送指定默认字符集的REST请求,但查看其来源,我认为没有,但我没有尝试过。

至少,你需要修复你的 EncodeAsUTF8()功能。它不会产生UnicodeString它保存 UTF-8 编码的八位字节,就像您想象的那样。它产生一个UTF-8编码的AnsiString然后将其转换为 UTF-16 编码的 UniodeString使用 RTL 的默认 Ansi 代码页,因此您调用的数据转换会丢失 UTF-8 数据。试试这个:

function TTwitterApi.EncodeAsUTF8(UnicodeStr: string): string;
var
UTF8Str: UTF8String;
I: Integer;
begin
UTF8Str := UTF8String(UnicodeStr);
SetLength(Result, Length(UTF8Str));
for I := 1 to Length(UTF8Str) do
Result[I] := Char(Ord(UTF8Str[I]));
end;

这应该允许 TRESTClient至少在其 POST 数据中对正确的 UTF-8 数据进行 url 编码。但你仍然要处理失踪的问题charset Content-Type 中的属性请求 header (除非在未指定 charset 时 Twitter 默认为 UTF-8)。

现在,综上所述,如果您发现可以围绕 TRESTClient 进行工作问题不适合你,那么我建议切换到 Indy 的 TIdHTTP组件(其 application/x-www-form-urlencoded 实现比 TRESTClient 所使用的更准确),例如:

procedure TTwitterApi.Send(Tweet: string);
var
Params: TStringList;
begin
Reset;

Params := TStringList.Create;
try
FParams.Add('status=' + Tweet);
FIdHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
FIdHTTP.Request.Charset := 'utf-8';
FIdHTTP.Post('https://api.twitter.com/1.1/statuses/update.json', Params, IndyTextEncoding_UTF8);
finally
Params.Free;
end;
end;

关于delphi - TRestClient Delphi XE5中对UTF-8编码字符串的支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20092510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com