gpt4 book ai didi

delphi - 目标多字节代码页中不存在 Unicode 字符的映射? (德尔福XE6)

转载 作者:行者123 更新时间:2023-12-03 15:18:22 32 4
gpt4 key购买 nike

以下代码适用于 Win32,无论如何,如果在 Android 或 iOS 上运行,它会引发异常。异常(exception)情况是:“目标多字节代码页中不存在 Unicode 字符的映射”

function Form1.ZDecompressString(aText: String): String;
var
strInput,
strOutput : TStringStream;
Unzipper : TZDecompressionStream;
begin

Result := '';
strInput := TStringStream.Create( aText );
strOutput := TStringStream.Create;

try

Unzipper := TZDecompressionStream.Create( strInput );

try
strOutput.CopyFrom( Unzipper, Unzipper.Size );
finally
Unzipper.Free;
end;

Result := strOutput.DataString;

finally
strInput.Free;
strOutput.Free;
end;
end;

procedure Form1.getUsers;
var
XMLRqst : String;
XMLResponse : TStringStream;
XMLRequest : TStringStream;
idHTTP : TIdHTTP;

s : String;
begin

XMLRqst := UTF8ToString( '<root company="belvew"/>' );
XMLRequest := TStringStream.Create( XMLRqst, TEncoding.UTF8 );
XMLResponse := TStringStream.Create( '' );

try
try
idHTTP := TIdHTTP.Create( Self );
idHTTP.CookieManager := idCookieManager;
idHTTP.ReadTimeout := 60000;{ IdTimeoutInfinite; }
idHTTP.ConnectTimeout := 60000;
idHTTP.HandleRedirects := True;

XMLResponse.Position := 0;
XMLRequest.Position := 0;

idHTTP.Post( 'http://localhost/API/getUsers.aspx', XMLRequest, XMLResponse );
idHTTP.Disconnect;

unique_id := ZDecompressString( XMLResponse.DataString );

XMLRequest.Free;
XMLResponse.Free;

except
on E : Exception do
begin
ShowMessage( 'exception : '#13 + E.Message );
end;
end;

finally
idHTTP.Free;
end;

end;

procedure Form1.onCreate( Sender : TObject );
begin
getUsers;
end;
  • 为什么代码在 Android 或 iOS 下不起作用?

最佳答案

我想说你需要扔掉这段代码并重新开始。与我遇到过的所有压缩算法一样,zlib 不对文本进行操作。它对字节数组进行操作。早在 Delphi 字符串使用 8 位编码的时代,人们就快速而随意地使用这些字符串,将它们视为字节数组。从那时起,压缩可以对字符串进行操作的误解就一直存在。

您需要选择一种编码来将文本转换为字节数组。 UTF-8 是一个不错的选择。然后如果你想将压缩后的数据表示为文本,你需要使用像base64这样的编码。

压缩过程如下:

  1. 将文本编码为 UTF-8 字节数组。
  2. 使用 zlib 压缩。
  3. 使用 base64 对压缩字节数组进行编码。

在相反的方向上,您会:

  1. 将 Base64 文本解码为压缩字节数组。
  2. 使用 zlib 解压该文件。
  3. 将 UTF-8 编码的字节数组解码为文本。

要编码/解码 UTF-8,请使用 TEncoding.UTF8GetBytesGetString 方法正是您所需要的。对于 Base64 编码/解码,最好建议您使用 Indy 库,因为您已经在使用它了。

<小时/>

根据评论,您已经解压缩为 UTF-8 编码的字节数组。在这种情况下,最后一步是编写:

text := TEncoding.UTF8.GetString(utf8byteArray);

关于delphi - 目标多字节代码页中不存在 Unicode 字符的映射? (德尔福XE6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24652341/

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