Delphi: проблемы с кодировкой CDO.Message

Мы написали программу Delphi, которая отправляет некоторую информацию с помощью CDO.

На моей машине Win7 (венгерская) акценты работают нормально.

Так что, если я отправил письмо с "ÁÉÍÓÖŐÚÜŰ", я получил его в этом формате. Я использовал кодировку iso-8859-2 в теле, и это кодирует тему и адреса электронной почты (адрес отправителя содержит имя).

Я думал, что закончил с этим.

Но когда я пытаюсь отправить почту с англоязычной машины Win2k3 (почтовый сервер тот же!), результат обрезает некоторые акценты: Ű = U Ő = O

Затем я попытался использовать кодировку UTF-8 здесь.

Это дало акценты - но неправильные акценты.

Почта содержит диакритические знаки со знаком ^.

ê <> é

Это недопустимая венгерская буква... :-(

Поэтому я хочу знать, как преобразовать или настроить ввод, чтобы получить хороший результат.

Я попытался зарегистрировать тело, чтобы увидеть изменения...

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

... или нет.

Но эти журналы дают хороший результат, ввод хороший.

Так что возможно потерянное и неправильно преобразованное сообщение на CDO.

Могу ли я помочь CDO, если смогу закодировать текст ANSI в настоящий UTF. Но в функциях конвертера Delphi нет параметров "CodePage". В Python я могу сказать:

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

or

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

Но в Delphi я не вижу этого параметра.

Кто-нибудь знает, как сохранить акценты, как преобразовать акцентированные венгерские строки, чтобы сохранить их акцентированный формат?

И я хочу знать, могу ли я проверить результат, не отправляя почту?

Спасибо за помощь: дд


person durumdara    schedule 04.09.2010    source источник
comment
Пожалуйста, сообщите нам версию Delphi, с которой вы работаете. Работа отличается от версии 2009 года и выше, так как они ввели UNICODE.   -  person Ralph M. Rickenbach    schedule 04.09.2010
comment
В дополнение к версии Delphi также полезно знать, как вы получаете доступ к функциям CDO. Я только что импортировал библиотеку типов для этого компонента и не могу найти никаких функций с именами encode или decode, только GetEncodedContentStream/GetDecodedContentStream. Если python предлагает эти функции кодирования/декодирования, возможно, python дополняет фактическую реализацию CDO, добавляя дополнительные методы.   -  person Marjan Venema    schedule 04.09.2010
comment
Итак: я хочу закодировать поля в UTF. Но я не знаю, как это сделать в Delphi. Поскольку у функции нет параметра, в котором кодовая страница/язык используется для кодирования или декодирования... Пожалуйста, помогите мне в этом! Спасибо: дд   -  person durumdara    schedule 07.09.2010


Ответы (1)


быстрый поиск в Google с «кодовой страницей строки delphi» привел меня к страницам Torry delphi и, возможно, к следующим фрагментам кода (найдено здесь). осветить вашу проблему:

{: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 }

--Райнхард

person pastacool    schedule 07.09.2010
comment
Привет! Я использовал ваш код для преобразования строки. Когда я делаю это в венгерской Windows, CDO отправляет обычные символы с акцентом. Когда я посылаю в английскую машину, акцент пропадает. Тем не менее, перед отправкой я конвертирую их в WideString и устанавливаю для BodyPart.CharSet значение iso-8859-2 или utf-8... :-( - person durumdara; 08.09.2010
comment
Кроме того, я протестировал две машины с помощью простого кода. Это не использует CDO, только WideString и UTF. Я сгенерировал их в файл. Я сравнил два файла, и они идентичны, независимо от того, где я создал. Так что это похоже на проблему CDO - но я не знаю, где искать решение... :-( - person durumdara; 08.09.2010
comment
Я тестировал сегодня с Python и CDO. Строки Python преобразуются по мере необходимости в почту. Акценты хорошо просматриваются. Итак, вот в чем вопрос: что мы делаем неправильно в Delphi, чтобы потерять акценты из WideStrings, и что Python делает, чтобы они остались? - person durumdara; 09.09.2010
comment
Я пробовал с 28592 и 1250, но ни с Delphi, ни с английскими окнами ничего не получалось... :-( - person durumdara; 09.09.2010
comment
Я решил проблему. Проблема заключалась в том, что я использовал объект Delphi, обертку для CDO. И это использовало свойства String, которые молча и прозрачно преобразовывали WideStrings в Strings... Извините за беспокойство и спасибо за хорошее решение! - person durumdara; 09.09.2010
comment
@durumdara: извините, не мог ответить раньше - ваша проблема решена или у вас все еще есть проблемы с отсутствующими акцентами? - person pastacool; 09.09.2010