2

CDOでいくつかの情報を送信するDelphiプログラムを作成しました。

私のWin7マシン(ハンガリー語)では、アクセントはうまく機能しています。

ですから、「ÁÉÍÓÖŐÚÜŰ」というメールを送ったら、この形式で届きました。本文にiso-8859-2エンコーディングを使用しました。これにより、件名と電子メールアドレスがエンコードされます(送信者アドレスには名前が含まれます)。

これで終わったと思いました。

しかし、Win2k3英語のマシンからメールを送信しようとすると(メーリングサーバーは同じです!)、結果はいくつかのアクセントを切り捨てます:Ű=UŐ= O

次に、ここでUTF-8エンコーディングを使用してみました。

これはアクセントを提供しましたが、間違ったアクセントです。

メールには^記号の付いたアクセントが含まれています。

ê<>é

これは有効なハンガリーの手紙ではありません...:-(

ですから、入力を変換または設定する方法を知りたいのですが、良い結果が得られました。

変更を確認するために本文をログに記録しようとしました...

Log(SBody);
Msg.Body := SBody;
Log(Msg.Body);

... か否か。

しかし、これらのログは良い結果を提供しており、入力は良好です。

そのため、CDOでメッセージが失われたり、誤って変換されたりする可能性があります。

ANSIテキストを実際のUTFにエンコードできれば、CDOを支援できますか。しかし、Delphiのコンバーター関数には、「CodePage」パラメーターがありません。Pythonで私は言うことができます:

s.encode('iso-8859-2')

また

s.decode('iso-8859-2')

しかし、Delphiでは、このパラメータは表示されません。

アクセントを保持する方法、アクセント付きのハンガリー語の文字列を変換してアクセント形式を保持する方法を知っている人はいますか?

知りたいのですが、メールを送信せずに結果を確認できますか?

あなたの助けをありがとう:dd

4

1 に答える 1

0

「デルファイ文字列コードページ」で簡単にグーグル検索すると、トーリーのデルファイページにたどり着きました 。おそらく、次のコードニペット(ここにあります)があなたの問題に光を当てることができます:

{:Converts Unicode string to Ansi string using specified code page.
  @param   ws       Unicode string.
  @param   codePage Code page to be used in conversion.
  @returns Converted ansi string.
}

function WideStringToString(const ws: WideString; codePage: Word): AnsiString;
var
  l: integer;
begin
  if ws = ' then
    Result := '
  else 
  begin
    l := WideCharToMultiByte(codePage,
      WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
      @ws[1], - 1, nil, 0, nil, nil);
    SetLength(Result, l - 1);
    if l > 1 then
      WideCharToMultiByte(codePage,
        WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
        @ws[1], - 1, @Result[1], l - 1, nil, nil);
  end;
end; { WideStringToString }


{:Converts Ansi string to Unicode string using specified code page.
  @param   s        Ansi string.
  @param   codePage Code page to be used in conversion.
  @returns Converted wide string.
}
function StringToWideString(const s: AnsiString; codePage: Word): WideString;
var
  l: integer;
begin
  if s = ' then
    Result := '
  else 
  begin
    l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), - 1, nil, 0);
    SetLength(Result, l - 1);
    if l > 1 then
      MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]),
        - 1, PWideChar(@Result[1]), l - 1);
  end;
end; { StringToWideString }

--ラインハルト

于 2010-09-07T12:26:07.357 に答える