【发布时间】:2010-04-23 10:38:45
【问题描述】:
在 Delphi 2007 中,您可以将 UTF-8 字符串存储在 WideString 中,然后将其传递给 Win32 函数,例如
var
UnicodeStr: WideString;
UTF8Str: WideString;
begin
UnicodeStr:='some unicode text';
UTF8Str:=UTF8Encode(UnicodeStr);
Windows.SomeFunction(PWideChar(UTF8Str), ...)
end;
Delphi 2007 不会干扰 UTF8Str 的内容,即它作为 UTF-8 编码的字符串保留在 WideString 中。
但在 Delphi 2010 中,我正在努力寻找一种方法来做同样的事情,即将 UTF-8 编码的字符串存储在 WideString 中,而不会自动从 UTF-8 转换。我无法将指针传递给 UTF-8 字符串(或 RawByteString),例如以下显然行不通:
var
UnicodeStr: WideString;
UTF8Str: UTF8String;
begin
UnicodeStr:='some unicode text';
UTF8Str:=UTF8Encode(UnicodeStr);
Windows.SomeFunction(PWideChar(UTF8Str), ...)
end;
【问题讨论】:
-
我用解决方案更新了我的答案。
-
仅供参考,原始 2007 代码确实会干扰 UTF-8 数据。 2007 年,
UTF8Encode()返回了一个 UTF-8 编码的AnsiString。在每个版本中,将AnsiString分配给WideString会使用操作系统默认的Ansi 代码页执行Ansi->UTF16 转换。最后的WideString不包含 UTF-8 数据。它包含 UTF-16 数据。转换没有 UTF-8 存在的概念,因此如果原始输入使用任何非 ASCII 字符,则可能会损坏数据。
标签: string delphi unicode utf-8 utf-16