2017-12-15 29 views
-3

私はDelphi XE3を使用しています。PAnsiCharはUnicode文字列をAnsi文字列のポインタに変換しますか?

私は次のようにPAnsiCharは、直接、ANSI文字列へのポインタにUnicode文字列を変換できるかどうかを疑問に思う:

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? 

おかげ

+0

答えは、発行されたコンパイラの警告です。 – Victoria

答えて

1
P1 := PAnsiChar(MyString); 

をこれは変換されません。ポインタには、UTF-16データのアドレスが含まれます。代わりに、次のものが必要です。

P1 := PAnsiChar(AnsiString(MyString)); 

もちろん、コンパイラは、UTF-16からANSIに変換するときにデータが失われる可能性について賞賛します。なぜあなたがこれを熟考しているのか、非常に注意深く尋ねるべきです。

MyString1 := P1; 

ANSIテキストはUTF-16に変換されます。

+0

UTF-16からANSIへの変換はいつデータ損失の原因になりますか?私は変換がロスレスだと思う。 – alancc

+0

ANSI文字列は、Unicodeのサブセットのみをエンコードします。したがって、ソース文字列が一般的なANSIロケールでカバーされていないコードポイントをエンコードする場合、変換できません。置換文字が表示されます(通常は '?')。 –

+0

ありがとうございます。実際に私は過去にこれに気づいたことはありません。私は頻繁にATLとMFCの文字列変換マクロを使用します: https://msdn.microsoft.com/en-us/library/87zae4a3.aspx したがって、ANSIからUnicodeにデータが失われる場合、上記のマクロCW2Aのような記事でもデータが失われてしまいますが、なぜMSはそのような問題を彼の文書に言及していませんか? – alancc

関連する問題