在UnicodeString中存储UTF-8字符串

Mic*_*ick 9 delphi string unicode utf-8 utf-16

在Delphi 2007中,您可以在WideString中存储UTF-8字符串,然后将其传递给Win32函数,例如

var
  UnicodeStr: WideString;
  UTF8Str: WideString;
begin
  UnicodeStr:='some unicode text';
  UTF8Str:=UTF8Encode(UnicodeStr);
  Windows.SomeFunction(PWideChar(UTF8Str), ...)
end;
Run Code Online (Sandbox Code Playgroud)

Delphi 2007不会干扰UTF8Str的内容,即它保留为存储在WideString中的UTF-8编码字符串.

但是在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;
Run Code Online (Sandbox Code Playgroud)

Zoë*_*son 13

您的原始Delphi 2007代码使用ANSI代码页将UTF-8字符串转换为宽字符串.要在Delphi 2010中执行相同的操作,您应该使用SetCodePage和Convert参数false.

var
  UnicodeStr: UnicodeString;
  UTF8Str: RawByteString;
begin
  UTF8Str := UTF8Encode('some unicode text');
  SetCodePage(UTF8Str, 0, False);
  UnicodeStr := UTF8Str;
  Windows.SomeFunction(PWideChar(UnicodeStr), ...)
Run Code Online (Sandbox Code Playgroud)