Delphi の TDdeClientConv と TDdeServerConv の受け渡しでデフォルトコートページ以外の文字列を受け渡す
Delphi の TDdeClientConv と TDdeServerConv 間の文字列受け渡しでデフォルトコートページ以外の文字を含むとデータが破損して渡されてしまう
(Unicodeにしか存在しない文字を使用したファイルパスを受け渡す等)
原因は Vcl.DdeMan が Unicode化されておらず ExecuteMacro関数の引数が PAnsiChar となっているため、UTF-8 の文字列を AnsiChar へ変換してから送信している
Unicode版へ書き直すのが正しいのだろうが
自身のアプリケーション間であれば base64 でエンコードして送信、受信してデコードすればよい
System.NetEncoding の
TNetEncoding.Base64.Encode
TNetEncoding.Base64.Decode
デフォルトコートページ内で収まらない文字列のときだけエンコードする場合は、判定後に送信文字列にヘッダなどを付与する
判定関数(デフォルトエンコードして戻して比較)
function IsDefaultCodePageCompatible(const S: string): Boolean;
var
EncodedBytes: TBytes;
begin
try
EncodedBytes := TEncoding.default.GetBytes(S);
Result := (S = TEncoding.default.GetString(EncodedBytes));
except
on E: Exception do begin
Result := False;
end;
end;
end;
コメント