1 (edited by kovalenko 2017-10-10 13:11:50)

Topic: Кодировка, вместо кириллицы ромбики

Дмитрий не подскажите в чём дело. У меня версия 3,6, есть скрипт формирующий отправку письма через почтового клиента ПК, но при попытке вставить из текстового поля Edit1 слово на кириллице, ахтунг...ромбики. С латиницей всё ок.


procedure frmOrderRegistrationKey_Button1_OnClick (Sender: string; var Cancel: boolean);
begin
   OpenFile('mailto:'+frmOrderRegistrationKey.Label4.Caption+'?Subject='+'CKAP: Request activation code'+'&Body='+frmOrderRegistrationKey.edSNpc.Text+'%0d'+'Name:'+frmOrderRegistrationKey.Edit1.Text+'%0d'+'Emaile:'+frmOrderRegistrationKey.Edit2.Text);
end;
надо идти вперёд....

Re: Кодировка, вместо кириллицы ромбики

какой почтовый клиент используется?

Dmitry.

Re: Кодировка, вместо кириллицы ромбики

DriveSoft wrote:

какой почтовый клиент используется?

The Bat

надо идти вперёд....

Re: Кодировка, вместо кириллицы ромбики

Проверить в The Bat возможности нет, проверил почтовым клиентом встроенным в оперу, все ок. Думаю тут ничего не поделать, лучше отправить письмо непосредственно из проекта.

Dmitry.

Re: Кодировка, вместо кириллицы ромбики

DriveSoft wrote:

Проверить в The Bat возможности нет, проверил почтовым клиентом встроенным в оперу, все ок. Думаю тут ничего не поделать, лучше отправить письмо непосредственно из проекта.

Спасибо за ответ. Тогда вопрос, есть возможность скриптом переписывать имя на кириллице в латиницу?  Типа Сергей в Sergey?

надо идти вперёд....

Re: Кодировка, вместо кириллицы ромбики

kovalenko
Можете сделать функцию, которая меняет русские буквы на латинские, пример

function ToLatinica(s: string): string;
begin
    result := s;
    result := ReplaceStr(result, 'с', 's');
    result := ReplaceStr(result, 'г', 'g');
    .... нужно прописать для всех букв
end;

procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);
begin
    ShowMessage( ToLatinica('сергей') );
end;
Dmitry.

Re: Кодировка, вместо кириллицы ромбики

Спасибо. Дмитрий если можно ещё вопрос. Есть форма справочников с кучей гридов, сейчас делаю, что-бы в гридах авт.менялся размер ячеек при выводе на полный экран, делаю так:

procedure frmDict_OnShow (Sender: string; Action: string);
 var
    i, c: integer;
begin
    c := (frmDict.GridSerial.Columns.Count - 1) and  (frmDict.GridAppearance.Columns.Count - 1) and  (frmDict.GridComplet.Columns.Count - 1) and  (frmDict.GridRepairStatus.Columns.Count - 1) and  (frmDict.GridOrderType.Columns.Count - 1);
    for i := 0 to c do
        frmDict.GridSerial.Columns[i].Options := frmDict.GridSerial.Columns[i].Options + coAutoSize ;
        frmDict.GridAppearance.Columns[i].Options := frmDict.GridAppearance.Columns[i].Options + coAutoSize ;
        frmDict.GridComplet.Columns[i].Options := frmDict.GridComplet.Columns[i].Options + coAutoSize ;
        frmDict.GridRepairStatus.Columns[i].Options := frmDict.GridRepairStatus.Columns[i].Options + coAutoSize ;
        frmDict.GridOrderType.Columns[i].Options := frmDict.GridOrderType.Columns[i].Options + coAutoSize ;
end;

Как-то можно упростить/оптимизировать скрип?
Спасибо.

надо идти вперёд....

Re: Кодировка, вместо кириллицы ромбики

kovalenko
данный код ошибочен, упростить неполучиться. Для каждого грида нужно использовать свой цикл

procedure frmDict_OnShow (Sender: string; Action: string);
var
    i, c: integer;
begin
    c := frmDict.GridSerial.Columns.Count - 1;
    for i := 0 to c do
        frmDict.GridSerial.Columns[i].Options := frmDict.GridSerial.Columns[i].Options + coAutoSize ;


    c := frmDict.GridAppearance.Columns.Count - 1;
    for i := 0 to c do
        frmDict.GridAppearance.Columns[i].Options := frmDict.GridAppearance.Columns[i].Options + coAutoSize ;

    // и так для всех гридов
end;
Dmitry.

Re: Кодировка, вместо кириллицы ромбики

DriveSoft wrote:

kovalenko
данный код ошибочен, упростить неполучиться. Для каждого грида нужно использовать свой цикл

procedure frmDict_OnShow (Sender: string; Action: string);
var
    i, c: integer;
begin
    c := frmDict.GridSerial.Columns.Count - 1;
    for i := 0 to c do
        frmDict.GridSerial.Columns[i].Options := frmDict.GridSerial.Columns[i].Options + coAutoSize ;


    c := frmDict.GridAppearance.Columns.Count - 1;
    for i := 0 to c do
        frmDict.GridAppearance.Columns[i].Options := frmDict.GridAppearance.Columns[i].Options + coAutoSize ;

    // и так для всех гридов
end;

Т.е мне предпочтительней всё переписать под ваш вариант?

надо идти вперёд....

Re: Кодировка, вместо кириллицы ромбики

Да.

Dmitry.

Re: Кодировка, вместо кириллицы ромбики

DriveSoft wrote:

Да.


Спасибо, пошёл переписывать((()))))!

надо идти вперёд....

Re: Кодировка, вместо кириллицы ромбики

DriveSoft wrote:

Проверить в The Bat возможности нет, проверил почтовым клиентом встроенным в оперу, все ок. Думаю тут ничего не поделать, лучше отправить письмо непосредственно из проекта.

Дмитрий ещё раз здравствуйте. Я всё со своим...А нельзя в конкретном скрипте принудительно на данную операцию подключить конкретную кодировку. Видел вот такое
mysql_query("SET NAMES utf8");

я понимаю что это мне не подходить, но на основании примера мне как-то можно сие прикрутить?

надо идти вперёд....

Re: Кодировка, вместо кириллицы ромбики

kovalenko
Это не имеет отношение к данной проблеме.
Программе уже использует для текста utf8, видимо The Bat что-то неверно обрабатывает, на это к сожалению я повлиять не могу.

Dmitry.

Re: Кодировка, вместо кириллицы ромбики

DriveSoft wrote:

kovalenko
Это не имеет отношение к данной проблеме.
Программе уже использует для текста utf8, видимо The Bat что-то неверно обрабатывает, на это к сожалению я повлиять не могу.

Дмитрий, извините за назойливость... А вот этот код можно прикрутить/адаптировать к вашей программе:

function TranslitRus2Lat(const Str: string): string;
const
  RArrayL = 'абвгдеёжзийклмнопрстуфхцчшщьыъэюя';
  RArrayU = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ';
  colChar = 33;
  arr: array[1..2, 1..ColChar] of string =
  (('a', 'b', 'v', 'g', 'd', 'e', 'yo', 'zh', 'z', 'i', 'y',
    'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f',
    'kh', 'ts', 'ch', 'sh', 'shch', '''', 'y', '''', 'e', 'yu', 'ya'),
    ('A', 'B', 'V', 'G', 'D', 'E', 'Yo', 'Zh', 'Z', 'I', 'Y',
    'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F',
    'Kh', 'Ts', 'Ch', 'Sh', 'Shch', '''', 'Y', '''', 'E', 'Yu', 'Ya'));
var
  i: Integer;
  LenS: Integer;
  p: integer;
  d: byte;
begin
  result := '';
  LenS := length(str);
  for i := 1 to lenS do
  begin
    d := 1;
    p := pos(str[i], RArrayL);
    if p = 0 then
    begin
      p := pos(str[i], RArrayU);
      d := 2
    end;
    if p <> 0 then
      result := result + arr[d, p]
    else
      result := result + str[i]; //если не русская буква, то берем исходную
  end;
end;
надо идти вперёд....

15 (edited by iacovlogica 2017-10-17 06:25:05)

Re: Кодировка, вместо кириллицы ромбики

Всем Ку ! ( Дмитрию два раза Ку ! )
Если кому поможет то я писал функцию преобразования юникода в читабельный вид .
Например \u041a\u0438\u0435\u0432\u0441\u043a\u043e\u0435, \u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440\u0441\u043a\u0438\u0439 \u043a\u0440\u0430\u0439, \u0420\u043e\u0441\u0441\u0438\u044f  = Киевское, Краснодарский край, Россия

function DecodeUTF(stroka:string):string ;
 var
 dlina,poz : int ;
 symvol,promej: string ;
 f : Boolean ;
begin
  f:=false ;
  dlina := Length(stroka);
  if dlina > 0 then  // Если строка не пустая
    begin
      if pos('\u',stroka)<>0 then   // Если есть юникод
        begin
             While dlina > 0 do
             begin
                poz := pos('\u',stroka);
                if poz > 1 then
                  begin
                    result :=result+ copy(stroka,1,poz-1);
                    Delete(stroka,1,poz-1);
                     dlina := dlina - poz +1 ;

                  end
                else
                  begin
                     if poz>0 then
                        begin
                          symvol:= copy(stroka,5,2);
                          case symvol of
                             '10': promej :=  'А';
                             '30': promej :=  'а';
                             '11': promej :=  'Б';
                             '31': promej :=  'б';
                             '12': promej :=  'В';
                             '32': promej :=  'в';
                             '13': promej :=  'Г';
                             '33': promej :=  'г';
                             '14': promej :=  'Д';
                             '34': promej :=  'д';
                             '15': promej :=  'Е';
                             '35': promej :=  'е';
                             '01': promej :=  'Ё';
                             '51': promej :=  'ё';
                             '16': promej :=  'Ж';
                             '36': promej :=  'ж';
                             '17': promej :=  'З';
                             '37': promej :=  'з';
                             '18': promej :=  'И';
                             '38': promej :=  'и';
                             '19': promej :=  'Й';
                             '39': promej :=  'й';
                             '1a': promej :=  'К';
                             '3a': promej :=  'к';
                             '1b': promej :=  'Л';
                             '3b': promej :=  'л';
                             '1c': promej :=  'М';
                             '3c': promej :=  'м';
                             '1d': promej :=  'Н';
                             '3d': promej :=  'н';
                             '1e': promej :=  'О';
                             '3e': promej :=  'о';
                             '1f': promej :=  'П';
                             '3f': promej :=  'п';
                             '20': promej :=  'Р';
                             '40': promej :=  'р';
                             '21': promej :=  'С';
                             '41': promej :=  'с';
                             '22': promej :=  'Т';
                             '42': promej :=  'т';
                             '23': promej :=  'У';
                             '43': promej :=  'у';
                             '24': promej :=  'Ф';
                             '44': promej :=  'ф';
                             '25': promej :=  'Х';
                             '45': promej :=  'х';
                             '26': promej :=  'Ц';
                             '46': promej :=  'ц';
                             '27': promej :=  'Ч';
                             '47': promej :=  'ч';
                             '28': promej :=  'Ш';
                             '48': promej :=  'ш';
                             '29': promej :=  'Щ';
                             '49': promej :=  'щ';
                             '2a': promej :=  'Ъ';
                             '4a': promej :=  'ъ';
                             '2d': promej :=  'Ы';
                             '4b': promej :=  'ы';
                             '2c': promej :=  'Ь';
                             '4c': promej :=  'ь';
                             '2d': promej :=  'Э';
                             '4d': promej :=  'э';
                             '2e': promej :=  'Ю';
                             '4e': promej :=  'ю';
                             '2f': promej :=  'Я';
                             '4f': promej :=  'я ';  // По окончании написаниия программы удалите пробел после буквы "я"   )))(все останется работоспособным)
                             'b0': promej :=  '°';   // Градусы это ))) , нужны были ....
                          else
                            begin
                              promej:= '\u';
                              f := True ;
                            end;
                          end;

                             result := result + promej ;
                             if f=False then
                                begin
                                 dlina := dlina - 6 ;
                                Delete(stroka,1,6)
                                end
                             else
                                begin
                                Delete(stroka,1,2);
                                dlina := dlina - 2 ;
                                end;
                             f :=False ;

                        end
                      else
                        begin
                        result := result+ stroka;
                        dlina:=0 ;
                        end;

                    end;

                end; // Конец цикла while
         end
       else result := stroka ; // если нет юникода
    end  // if dlina > 0 then  // Если строка не пустая
  else
    begin
       result:='' ;  // Если пустая строка
    end;
end;

Re: Кодировка, вместо кириллицы ромбики

iacovlogica wrote:

Всем Ку ! ( Дмитрию два раза Ку ! )
Если кому поможет то я писал функцию преобразования юникода в читабельный вид .
Например \u041a\u0438\u0435\u0432\u0441\u043a\u043e\u0435, \u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440\u0441\u043a\u0438\u0439 \u043a\u0440\u0430\u0439, \u0420\u043e\u0441\u0441\u0438\u044f  = Киевское, Краснодарский край, Россия

function DecodeUTF(stroka:string):string ;
 var
 dlina,poz : int ;
 symvol,promej: string ;
 f : Boolean ;
begin
  f:=false ;
  dlina := Length(stroka);
  if dlina > 0 then  // Если строка не пустая
    begin
      if pos('\u',stroka)<>0 then   // Если есть юникод
        begin
             While dlina > 0 do
             begin
                poz := pos('\u',stroka);
                if poz > 1 then
                  begin
                    result :=result+ copy(stroka,1,poz-1);
                    Delete(stroka,1,poz-1);
                     dlina := dlina - poz -1 ;

                  end
                else
                  begin
                     if poz>0 then
                        begin
                          symvol:= copy(stroka,5,2);
                          case symvol of
                             '10': promej :=  'А';
                             '30': promej :=  'а';
                             '11': promej :=  'Б';
                             '31': promej :=  'б';
                             '12': promej :=  'В';
                             '32': promej :=  'в';
                             '13': promej :=  'Г';
                             '33': promej :=  'г';
                             '14': promej :=  'Д';
                             '34': promej :=  'д';
                             '15': promej :=  'Е';
                             '35': promej :=  'е';
                             '01': promej :=  'Ё';
                             '51': promej :=  'ё';
                             '16': promej :=  'Ж';
                             '36': promej :=  'ж';
                             '17': promej :=  'З';
                             '37': promej :=  'з';
                             '18': promej :=  'И';
                             '38': promej :=  'и';
                             '19': promej :=  'Й';
                             '39': promej :=  'й';
                             '1a': promej :=  'К';
                             '3a': promej :=  'к';
                             '1b': promej :=  'Л';
                             '3b': promej :=  'л';
                             '1c': promej :=  'М';
                             '3c': promej :=  'м';
                             '1d': promej :=  'Н';
                             '3d': promej :=  'н';
                             '1e': promej :=  'О';
                             '3e': promej :=  'о';
                             '1f': promej :=  'П';
                             '3f': promej :=  'п';
                             '20': promej :=  'Р';
                             '40': promej :=  'р';
                             '21': promej :=  'С';
                             '41': promej :=  'с';
                             '22': promej :=  'Т';
                             '42': promej :=  'т';
                             '23': promej :=  'У';
                             '43': promej :=  'у';
                             '24': promej :=  'Ф';
                             '44': promej :=  'ф';
                             '25': promej :=  'Х';
                             '45': promej :=  'х';
                             '26': promej :=  'Ц';
                             '46': promej :=  'ц';
                             '27': promej :=  'Ч';
                             '47': promej :=  'ч';
                             '28': promej :=  'Ш';
                             '48': promej :=  'ш';
                             '29': promej :=  'Щ';
                             '49': promej :=  'щ';
                             '2a': promej :=  'Ъ';
                             '4a': promej :=  'ъ';
                             '2d': promej :=  'Ы';
                             '4b': promej :=  'ы';
                             '2c': promej :=  'Ь';
                             '4c': promej :=  'ь';
                             '2d': promej :=  'Э';
                             '4d': promej :=  'э';
                             '2e': promej :=  'Ю';
                             '4e': promej :=  'ю';
                             '2f': promej :=  'Я';
                             '4f': promej :=  'я ';  // По окончании написаниия программы удалите пробел после буквы "я"   )))(все останется работоспособным)
                             'b0': promej :=  '°';   // Градусы это ))) , нужны были ....
                          else
                            begin
                              promej:= '\u';
                              f := True ;
                            end;
                          end;

                             result := result + promej ;
                             if f=False then
                                begin
                                 dlina := dlina - 6 ;
                                Delete(stroka,1,6)
                                end
                             else
                                begin
                                Delete(stroka,1,2);
                                dlina := dlina - 2 ;
                                end;
                             f :=False ;

                        end
                      else
                        begin
                        result := result+ stroka;
                        dlina:=0 ;
                        end;

                    end;

                end; // Конец цикла while
         end
       else result := stroka ; // если нет юникода
    end  // if dlina > 0 then  // Если строка не пустая
  else
    begin
       result:='' ;  // Если пустая строка
    end;
end;

Спасибо! Возможно это спасёт "отца русской демократии")))) Только один вопрос. Я не волшебник, а только учусь...Куда мне это воткнуть, что-бы функция отрабатывала только для текста, связанного с отправкой почты? Что-то вроде перечня текстовых полей, которые она должна обработать.

надо идти вперёд....

Re: Кодировка, вместо кириллицы ромбики

Саму функцию куда нибудь в кучу с другими где удобно , а применять :
......
var
Stroka_s_Kodom : string ;  //  переменные должны быть объявлены (имена неважны , я для примера их так назвал)
Stroka_Rezultat : string ;
.....
.....
Stroka_Rezultat := DecodeUTF(Stroka_s_Kodom);
.....
.....
я использовал примерно так ;
st:=HTTPGet('http://n..........................&lang=ru');
Form1.Memo1.Text := DecodeUTF( st) ;

Re: Кодировка, вместо кириллицы ромбики

iacovlogica wrote:

Саму функцию куда нибудь в кучу с другими где удобно , а применять :
......
var
Stroka_s_Kodom : string ;  //  переменные должны быть объявлены (имена неважны , я для примера их так назвал)
Stroka_Rezultat : string ;
.....
.....
Stroka_Rezultat := DecodeUTF(Stroka_s_Kodom);
.....
.....
я использовал примерно так ;
st:=HTTPGet('http://n..........................&lang=ru');
Form1.Memo1.Text := DecodeUTF( st) ;

Тогда если позволите ещё раз обращусь за советом, так мне будет проще понять

есть скрипт для отправки почты (пока делаю через почтовую программу установленную на пк):

OpenFile('mailto:'+frmOrder.edMailClien.Text+'?Subject='+'CKAP: Статус заказа. order'+'&Body='+'Уважаемый'+frmOrder.textClient.Text+'%0d'+'Name:'+frmOrderRegistrationKey.Edit1.Text+'%0d'+'Emaile:'+frmOrderRegistrationKey.Edit2.Text);

И здесь что у меня, кроме того что есть русский текст в скрипте (тема письма)+ добавляется информация из таблицы (frmOrder.textClient.Text) ну и там другие, пока тестовые поля. Вот у меня всё это надо из квадратиком превратить в буквы. Да, сам скрипт у меня срабатывает по нажатию кнопки.

надо идти вперёд....

Re: Кодировка, вместо кириллицы ромбики

О_о  а где вы квадратики видите ? в VisualDatabase ? или в полученной почте ?
Возможно нужно произвести обратные действия с текстом так как OpenFile может не понимать русский (не проверял)

Re: Кодировка, вместо кириллицы ромбики

iacovlogica wrote:

О_о  а где вы квадратики видите ? в VisualDatabase ? или в полученной почте ?
Возможно нужно произвести обратные действия с текстом так как OpenFile может не понимать русский (не проверял)

Квадратики у меня в The Bat..мне посоветовали поменять почтовик, возможно это и вариант, но как-то прирос что-ли. В почтовике уже всё облазил. При открытии сформированного письма, вместо кириллицы одни квадратики.

надо идти вперёд....

Re: Кодировка, вместо кириллицы ромбики

iacovlogica wrote:

О_о  а где вы квадратики видите ? в VisualDatabase ? или в полученной почте ?
Возможно нужно произвести обратные действия с текстом так как OpenFile может не понимать русский (не проверял)

Как-то так

Post's attachments

Attachment icon QIP Shot - Screen 004.png 69.04 kb, 208 downloads since 2017-10-16 

надо идти вперёд....

Re: Кодировка, вместо кириллицы ромбики

Настройки и кодировки в почтовике полагаю Вы все попробовали ?
Посмотрите справку почтовика там куча всего . (на чтение у меня просто нет времени)
.....и без исходника сложно гадать в чем проблема .