Delphi2009では内部文字コードがすべてUniCode化されました。
この変化がDelphi2007以前からのDelphiコードの移植に多少の混乱を与えます。
もっとも変化が大きいのはやはりCOMやActiveXを操作する場合でしょうか。
pCharでの文字列渡しの部分です。
Delphi2007まではpCharの内部はAnsi形式でした。
しかしDelphi2009ではWide形式に変わっています。
AnsiCharにキャストしないと動かない場合が多くなります。
たとえば
procedure HogeProc(Str: pChar);
というDllの内部関数があった場合、
いままでは HogeProc( pChar(HogeStr) );とキャストしていましたが、
としなければなりません。
pChar が pAnsiChar に変わっています。
また、これは未確認(私の環境でのみ成功している)情報ですが、UTF8のDBにデータを投入する際に、いままではEncodeUTF8を使っていた部分は、Delphi2009はそのまま投入しても大丈夫でした。
としていたものが、
でも正しく入りました。
(SQLite、MySQL)
これはまだ少量のデータでのみ(20万件ぐらい)で試しているので確かではないのですが、少し便利になっている可能性があります。
漢字の文字化けはないようです。
業務で使う場合はもう少し確認が必要だとも思います。
この変化がDelphi2007以前からのDelphiコードの移植に多少の混乱を与えます。
もっとも変化が大きいのはやはりCOMやActiveXを操作する場合でしょうか。
pCharでの文字列渡しの部分です。
Delphi2007まではpCharの内部はAnsi形式でした。
しかしDelphi2009ではWide形式に変わっています。
AnsiCharにキャストしないと動かない場合が多くなります。
たとえば
procedure HogeProc(Str: pChar);
というDllの内部関数があった場合、
いままでは HogeProc( pChar(HogeStr) );とキャストしていましたが、
var HogeStr: String; HogeProc( PAnsiChar(HogeStr) );
としなければなりません。
pChar が pAnsiChar に変わっています。
また、これは未確認(私の環境でのみ成功している)情報ですが、UTF8のDBにデータを投入する際に、いままではEncodeUTF8を使っていた部分は、Delphi2009はそのまま投入しても大丈夫でした。
var
SQL: String;
SQL := 'INSERT INTO test(name) VALUES (''テスト'') ';
DB.ExecSQL( EncodeUTF8(SQL) );としていたものが、
var
SQL: String;
SQL := 'INSERT INTO test(name) VALUES (''テスト'') ';
DB.ExecSQL( SQL );でも正しく入りました。
(SQLite、MySQL)
これはまだ少量のデータでのみ(20万件ぐらい)で試しているので確かではないのですが、少し便利になっている可能性があります。
漢字の文字化けはないようです。
業務で使う場合はもう少し確認が必要だとも思います。



「読む・書く・話す」を一瞬でモノにする技術


最近のコメント