2010-09-04 7 views
2

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

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

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

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

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

Далее я попытался использовать UTF-8.

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

Письмо содержит акценты с символами ^.

< ê> é

Это не относится венгерское письмо ... :-(

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

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

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

... или нет.

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

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

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

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

или

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

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

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

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

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

+0

Пожалуйста скажите нам версию Delphi вы работаете. Работы отличаются от версии 2009 года вверх, поскольку они ввели UNICODE. –

+0

В дополнение к версии Delphi это также поможет узнать, как вы получаете доступ к функциям CDO. Я просто импортировал библиотеку типов для этого компонента, и я не могу найти какие-либо функции с именем encode или decode, только GetEncodedContentStream/GetDecodedContentStream. Если python предлагает эти функции кодирования/декодирования, возможно, что python увеличивает реальную реализацию CDO, добавляя дополнительные методы. –

+0

Привет! Delphi 6 Professional. – durumdara

ответ

0

быстрый поиск Google с «Дельфи строки кодовой страницы» заставил меня torry's delphi pages и, возможно, следующие CodeSnippets (найденными here) может пролить некоторый свет на вашу проблему:

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

--reinhard

+0

Привет! Я использовал ваш код для преобразования строки. Когда я делаю это в венгерской Windows, CDO отправляет обычные, акцентированные символы. Когда я отправляю на английский компьютер, акцент теряется. Тем не менее, я конвертирую их в WideString перед отправкой и устанавливаю BodyPart.CharSet в iso-8859-2 или utf-8 ... :-( – durumdara

+0

Плюс Я тестировал две машины с простым кодом. Это не использует CDO, только WideString и UTF. Я сгенерировал их в файл. Я сравнивал эти два файла, и они идентичны, неважно, где я сгенерирован. Таким образом, это, похоже, проблема CDO, но я не знаю, где я поиск решения ... :-( – durumdara

+0

Я тестировал сегодня с помощью Python и CDO. Строки Python преобразуются по мере необходимости в почту. Акценты кажутся хорошими. Так вот в чем вопрос: что мы делаем неправильно в Delphi, чтобы потерять акценты из WideStrings, и что Python делает для них? – durumdara

Смежные вопросы