Delphi PAnsiChar会将Unicode字符串转换为Ansi字符串指针吗?

Delphi PAnsiChar会将Unicode字符串转换为Ansi字符串指针吗?,delphi,unicode,Delphi,Unicode,我正在使用delphixe3 我想知道PAnsiChar是否可以将Unicode字符串直接转换为指向Ansi字符串的指针,如下所示: var AnsiMyString: AnsiString; MyString, MyString1: MyString; P1: PAnsiChar; P2: PChar; begin MyString := “Test”; P1 := PAnsiChar(MyString); -> Will this line

我正在使用delphixe3

我想知道PAnsiChar是否可以将Unicode字符串直接转换为指向Ansi字符串的指针,如下所示:

var
   AnsiMyString: AnsiString;
   MyString, MyString1: MyString;
   P1: PAnsiChar;
   P2: PChar;
begin
    MyString := “Test”;
    P1 := PAnsiChar(MyString);    -> Will this line convert a Unicode string to a pointer of Ansi String?

    MyString1 := P1;  -> Will this line convert a Ansi string to a Unicode string?
谢谢

这不执行转换。指针包含UTF-16数据的地址。相反,您需要:

P1 := PAnsiChar(AnsiString(MyString));
当然,当从UTF-16转换到ANSI时,编译器会抱怨可能会丢失数据。你应该非常仔细地问自己,你为什么要考虑这个问题


ANSI文本将转换为UTF-16。

答案在发出的编译器警告中。何时从UTF-16转换为ANSI会导致数据丢失?我认为转换是无损的。ANSI字符串只编码Unicode的一个子集。因此,如果源字符串编码的代码点未被现行ANSI语言环境覆盖,则无法转换。您将看到一个替换字符,通常是
。非常感谢。事实上,我以前从未注意到这一点。我经常使用ATL和MFC字符串转换宏,请参阅:如果Unicode到ANSI会导致数据丢失,那么上面的宏,如CW2A也会导致数据丢失,为什么MS在他的文档中从未提到过这样的问题?我想这只是您应该知道的一件基本事情。和MS保持其参考文档简洁。看来你可能需要重新考虑处理国际文本的方法。
P1 := PAnsiChar(AnsiString(MyString));
 MyString1 := P1;