Le stockage de chaîne UTF-8 dans un UnicodeString

En Delphi 2007, vous pouvez stocker une chaîne UTF-8 dans un WideString et puis passer que sur une fonction Win32, par exemple

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

Delphi 2007 n'interfère pas avec le contenu de UTF8Str, c'est-à gauche comme une codé en UTF-8 chaîne stockée dans un WideString.

Mais en Delphi 2010 j'ai du mal à trouver un moyen de faire la même chose, c'est à dire stocker une codé en UTF-8 chaîne de caractères dans une WideString sans qu'il soit automatiquement converti en UTF-8. Je ne peux pas passer un pointeur vers une chaîne UTF-8 (ou RawByteString), par exemple, la suivante ne fonctionne évidemment pas:

var
  UnicodeStr: WideString;
  UTF8Str: UTF8String;
begin
  UnicodeStr:='some unicode text';
  UTF8Str:=UTF8Encode(UnicodeStr);
  Windows.SomeFunction(PWideChar(UTF8Str), ...)
end;
J'ai mis à jour ma réponse avec la solution.
Pour info, l'original 2007 code NE interférer avec les données UTF-8. En 2007, UTF8Encode() retourné une codé en UTF-8 AnsiString. Dans chaque version, l'attribution d'une AnsiString à un WideString effectue Ansi->UTF16 la conversion en utilisant le système d'exploitation par défaut de la page de codes Ansi. La finale WideString NE contient PAS de données UTF-8. Il contient les données UTF-16. La conversion n'a pas de concept que de l'UTF-8 était présent, et ne sont donc susceptibles de corrompre les données en cas d'entrée d'origine utilise des caractères non-ASCII.

OriginalL'auteur Mick | 2010-04-23