如何解决有没有办法只从字符串中获取 ANSI 字符?当字符串包含表情符号时,Utf8decode 失败
首先,我从 HTTP 请求中获取一个 TMemoryStream,其中包含响应的正文。 然后我将它加载到 TStringList 中并将文本保存在宽字符串中(也尝试使用 ansistring)。
问题是我需要转换字符串,因为用户语言是西班牙语,所以带重音符号的元音很常见,我需要存储信息。
lServerResponse := TStringList.Create;
lServerResponse.LoadFromStream(lResponseMemoryStream);
lStringResponse := lServerResponse.Text;
lDecodedResponse := Utf8Decode(lStringResponse );
如果响应(它的一部分)是“Hólá Múndó”,则 lStringResponse 的值将是“Hólá Múndó”,而 lDecodedResponse 将是“Hólá Múndó”。
但是如果用户添加任何表情符号(如果表情符号是?,lStringResponse 值将是“Hólá Múndó 😀”)Utf8Decode 失败并返回一个空字符串。 有没有办法只从字符串(或 MemoryStream)中获取 ANSI 字符?,或者删除 Utf8Decode 无法转换的任何内容?
感谢您的时间。
解决方法
TMemoryStream
只是原始字节。没有理由将该流加载到 TStringList
中只是为了从中提取 (Wide|Ansi)String
。您可以使用 AnsiString
将字节直接分配给 UTF8String
/SetString()
,例如:
var
lStringResponse: UTF8String;
lDecodedResponse: WideString;
begin
SetString(lStringResponse,PAnsiChar(lResponseMemoryStream.Memory),lResponseMemoryStream.Size);
lDecodedResponse := UTF8Decode(lStringResponse);
end;
请确保 HTTP 内容确实编码为 UTF-8,否则这种方法将不起作用。
话虽如此 - Delphi 7 中的 UTF8Decode()
(和 UTF8Encode()
)不支持 U+FFFF 以上的 Unicode 代码点,这意味着它们不强> 完全支持表情符号。这已在 Delphi 2009 中修复。
要在早期版本中解决该问题,您可以改用 Win32 API MultiByteToWideChar()
函数,例如:
uses
...,Windows;
function My_UTF8Decode(const S: UTF8String): WideString;
var
WLen: Integer;
begin
WLen := MultiByteToWideChar(CP_UTF8,PAnsiChar(S),Length(S),nil,0);
if WLen > 0 then
begin
SetLength(Result,WLen);
MultiByteToWideChar(CP_UTF8,PWideChar(Result),WLen);
end else
Result := '';
end;
var
lStringResponse: UTF8String;
lDecodedResponse: WideString;
begin
SetString(lStringResponse,lResponseMemoryStream.Size);
lDecodedResponse := My_UTF8Decode(lStringResponse);
end;
或者:
uses
...,Windows;
function My_UTF8Decode(const S: PAnsiChar; const SLen: Integer): WideString;
var
WLen: Integer;
begin
WLen := MultiByteToWideChar(CP_UTF8,S,SLen,WLen);
end else
Result := '';
end;
var
lDecodedResponse: WideString;
begin
lDecodedResponse := My_UTF8Decode(PAnsiChar(lResponseMemoryStream.Memory),lResponseMemoryStream.Size);
end;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。