delphi - 使用 UTF8String 转换非规范化字符
问题描述
在将 UTF-8 编码的表情符号转换为字符串时,我们没有使用 UTF8ToString 获得正确的字符。我们从外部接口接收这些 UTF8 字符。我们使用在线 UTF8 解码器测试了 UTF 字符,发现它们包含正确的字符。我怀疑这些是复合字符。
procedure TestUTF8Convertion;
const
utf8Denormalized: RawByteString = #$ED#$A0#$BD#$ED#$B8#$85#$20 + #$ED#$A0#$BD#$ED#$B8#$86#$20 + #$ED#$A0#$BD#$ED#$B8#$8A;
utf8Normalized: RawByteString = #$F0#$9F#$98#$85 + #$F0#$9F#$98#$86 + #$F0#$9F#$98#$8A;
begin
Memo1.Lines.Add(UTF8ToString(utf8Denormalized));
Memo1.Lines.Add(UTF8ToString(utf8Normalized));
end;
Memo1 中的输出:
非规范化:���� ���� ����
标准化:
基于WinApi函数编写自己的转换函数MultiByteToWideChar
并没有解决这个问题。
function UTF8DenormalizedToString(s: PAnsiChar): string;
var
pwc: PWideChar;
len: cardinal;
begin
GetMem(pwc, (Length(s) + 1) * SizeOf(WideChar));
len := MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, @s[0], -1, pwc, length(s));
SetString(result, pwc, len);
FreeMem(pwc);
end;
解决方案
推荐阅读
- hyperledger-fabric - 无法在超级账本结构 2.2 中调用基于 ChaincodeBase 的 Java 链码
- sql - 尝试更新 SQL 字段时出错
- java - 如何使用身份验证服务将 android 应用程序 Sqlite 后端部署到天蓝色?
- php - 从 SQL 查询中获取 PHP 数组后,如何对其进行操作?
- java - 如何对使用流的方法进行单元测试?
- scala - 根据参数双向循环Scala
- excel - Power Query - 合并两个表中的所有查找值并创建一个列
- flutter - 小部件测试以断言文本小部件样式
- c# - 如何将字符串列表转换为数字列表,然后在 C# 中对该列表应用 OrderByDescending
- python - 以编程方式编辑 PowerPoint 文件的幻灯片/页码