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;
コメント