gpt4 book ai didi

macos - Delphi - 将字符串从 UTF-8 转换回来

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

我在将 UTF-8 编码字符串转换回 delphi 可用的字符串时遇到问题。该应用程序是用 XE8 编写的,并部署在 Windows 和 OSX 上。该应用程序分别在 Windows 和 OSX 上使用 LimeLM API dll 和 dylib 库。 在 Windows 上一切正常,我遇到的问题是转换从 OSX 上的 dylib 库返回的字符串。我明白 dylib 进出的所有字符串都需要进行 UTF-8 编码。 LimeLM 函数返回一个 PWideChar 值,我假设该值将是 UTF 编码的。但无论我使用哪个函数尝试将值转换为 Delphi 中可用的东西,我得到的都是垃圾。

这是函数:

class function TurboActivate.GetFeatureValue(featureName: String): String;
var
value : PWideChar;
FieldName : PWideChar;
tmpStr : String;
begin

{$IFDEF MSWINDOWS}
FieldName := PwideChar(featureName);
{$ENDIF}
{$IFDEF MACOS}
FieldName := PWideChar(UTF8Encode(featureName));
{$ENDIF}


value := GetFeatureValue(FieldName, nil);

if (value = '') then
begin
raise ETurboActivateException.Create('Failed to get feature value. the feature doesn''t exist.');
end;
{$IFDEF MSWINDOWS}
Result := value;
{$ENDIF}
{$IFDEF MACOS}
tmpStr := UTF8ToString(value);
ShowMessage(tmpStr);
tmpStr := UTF8ToWideString(value);
ShowMessage(tmpStr);
tmpStr := UTF8ToUnicodeString(value);
ShowMessage(tmpStr);
tmpStr := UTF8ToAnsi(value);
ShowMessage(tmpStr);

Result := TmpStr;
{$ENDIF}

end;

肯定有一个需要解码的值,value = '散汤湡獤杀浔汧浥楡⹬潣m䌴䅓㜭䙇ⵊ䵙㑗㈭呖ⵆ䥉倏䈭脚́'#4

但 tmpStr 始终包含 '?????????c??????/'

如有任何帮助,我们将不胜感激。

最佳答案

value = '散汤湡獤杀潯汧浥楡⹬潣m䌴䅓㜭䙇ⵊ䵙㑗㈭呖ⵆ䥉儵䈭呎́'#4

这表明您正在解释 8 位文本(大概是 UTF-8 编码的),就好像它是 UTF-16 编码的一样。一般来说,当您看到包含中文字符的 UTF-16 字符串时,要么它是正确解释的中文文本,要么是错误解释的 8 位文本。

当您将该文本正确解释为 UTF-8 时,它是:

cedlands@googlemail.com 4CSA-7GFJ-YMW4-2VTF-II5Q-BNTA♥♦

我通过以下代码获得了它:

  Writeln(TEncoding.UTF8.GetString(
TEncoding.Unicode.GetBytes('散汤湡獤杀潯汧浥楡⹬潣m䌴䅓㜭䙇ⵊ䵙㑗㈭呖ⵆ䥉儵䈭呎́'#4)));

但是请注意,如果您查看 TEncoding.Unicode.GetBytes('散汤湡獤杀浔汧浥楡⹬潣m䌴䅓㜭䙇ⵊ䵙㑗㈭呖ⵆ䥉) 返回的字节数组倏䈭脚́'#4) 然后你会看到它包含一个null。因此实际上该字符串在电子邮件地址之后以空字符结尾。

问题从这里开始:

value : PWideChar;
....
value := GetFeatureValue(FieldName, nil);

事实上,GetFeatureValue 返回 PAnsiChar。假设我正确地解释了你的意思,有效负载是 UTF-8 编码的。

因此您需要进行以下更改:

  1. GetFeatureValue 的返回类型更改为 PAnsiChar
  2. value 的类型更改为 PAnsiChar
  3. 使用 UnicodeFromLocaleCharsTEncoding.GetStringvalue 转换为字符串。

可能看起来像这样:

var
Bytes: TBytes;
....
SetLength(Bytes, StrLen(value));
Move(value^, Pointer(Bytes)^, Length(Bytes));
str := TEncoding.UTF8.GetString(Bytes);

现在,对于将 str 设置为 cedlands@googlemail.com 的问题中的数据。如上所述,数据包含一个空终止符,当字符串被错误地解释为 UTF-16 时,该终止符无法终止字符串。也就是说,文本 4CSA-7GFJ-YMW4-2VTF-II5Q-BNTA♥♦ 来自缓冲区溢出。

关于macos - Delphi - 将字符串从 UTF-8 转换回来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30662955/

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