Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Что-то вроде транслитератора.


Страницы:   1 2

Gauss ©   (2008-02-22 15:11:00) 

Всем прива! Значит у меня возникла такая проблема:

Имеется форма, а на ней Memo1,Memo2, and Button1. Мне нужно, чтобы после прогона я записывал текст в Memo1 (записывал текс на азербайджанском языке, под юникод, как обычно) нажимал на кнопку и в Memo2 тот же текст отображался русскими буквами СООТВЕТСТВЕННО. Т.е. имелось соответствие между буквами руссокого алфавита и азерб-ми. Если вас затрудняют азерб-ие буквы, то преставьте на их месте что то другое, какие то символы например.
А именно код у меня вышел приблизительно такой
var
 Form1: TForm1;
  Const
    Az: array [0..3] of Char = (#252,#101,#105,#63); {Аскии Коды для азербайд-их букв, данные приведенные тут просто примеры}
    Rus: array [0..5] of Char = ('й','ц','у','н','р','ж'); {русские буквы соответствующие выше описанным буквам}
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
    s: String;
    i: Integer;
begin
   s := Memo1.Text;
 for i := 1 to Length (s) do
    if ord(s[i]) = ord(Az[i]) then
       begin
          s[i] := Rus[i];
       end;
 Memo2.Text := S;
end;

end.

Токо я знаю что я неправильно код написал, поэтому прошу помощи, как мне сделать так, чтобы появилось мне нужное соответсвие между этими символами и русскими буквами ???
Помогите пож-та)


Gauss   (2008-02-25 12:20:00) [1]

Помогите ребята, в проге такая вещь мне просто нужна,
korneley  ты прав, я тоже там сомневаюсь, только незнаю как исправить :(


> Я вот этого не понял:for i := 1 to Length (s) do   if ord(s[i])
> = ord(Az[i]) then      begin         s[i] := Rus[i];    
>  end;переменную цикла движем по исходной строке и ей же
> индексируем массив подстановки? Т.е первая буква азербайджанского
> может быть только на первом месте в транслитерируемой строке?
>  Или транслитерируется алфавит?


Gauss   (2008-02-24 22:54:00) [2]


> Ну и для юникода, как минимум для исходной строки, одинокого
> char в Az, маловато будет.


Ясно, а что еще нужно для этого?


korneley   (2008-02-24 08:27:00) [3]

Ну и для юникода, как минимум для исходной строки, одинокого char в Az, маловато будет.


korneley   (2008-02-24 08:20:00) [4]

Я вот этого не понял:
for i := 1 to Length (s) do
  if ord(s[i]) = ord(Az[i])then
     begin
        s[i] := Rus[i];
     end;

переменную цикла движем по исходной строке и ей же индексируем массив подстановки? Т.е первая буква азербайджанского может быть только на первом месте в транслитерируемой строке? Или транслитерируется алфавит?


TMemo   (2008-02-23 23:02:00) [5]

Если заполнить Memo1 вот так:

procedure TForm1.FormCreate(Sender: TObject);
var i:word;      s:string;
begin
s:='';
for i:=1 to 33 do s:=s+Az[i];

Memo1.Text:=s;

end;

qьertyuiopцgasdfghjkli?zxcvbnmзє.

То вот результат:

йцукенгшщзхъфывапролджэячсмитьбю.

Memo1 и Memo2 обычные, не юникодовские.


gauss   (2008-02-23 21:59:00) [6]

Общий код мой привожу внизу, а то задают вопросы почему не сходится кол-во элементов в массивах, а я устаю отвечать что это я для пробы написал. А теперь общий код, вот

unit MainUnit;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, TntStdCtrls;

type
 TForm1 = class(TForm)
   Memo1: TTntMemo;
   Memo2: TTntMemo;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }

 public
   { Public declarations }
 end;

var
 Form1: TForm1;

Const
 Az: array [1..33] of Char = (#113,#252,#101,#114,#116,#121,#117,#105,#111,#112,#246,#103,#97,#115,#100,#102, #103,#104,#106,#107,#108,#105,#63,#122,#120,#99,#118,#98,#110,#109,#231,#186,#46 );
Rus: array [1..33] of Char = ('й','ц','у','к','е','н','г','ш','щ','з','х','ъ','ф','ы','в','а','п','р','о','л' ,'д','ж','э','я','ч','с','м','и','т','ь','б','ю','.');

 implementation
 
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
   s: String;
   i: Integer;
begin
  s := Memo1.Text;
for i := 1 to Length (s) do
   if ord(s[i]) = ord(Az[i]) then
      begin
         s[i] := Rus[i];
      end;
Memo2.Text := S;
end;

end.



Но, результат всё же не хороший получается, и я не могу понять в чем проблема. То ли в Аскии кодах, то ли в самой сапостановке.Проблема в том что, результат у меня наполавину русскими наполавину англ-ми буквами дает. (?)


Gauss   (2008-02-22 23:10:00) [7]

Ок, попробую исправить эти значения. Посморим, если что я тут напишу)))


TMemo   (2008-02-22 19:33:00) [8]

Массив начинается с нуля:


Az: array [0..3] of Char = (#252,#101,#105,#63); {Аскии Коды для азербайд-их букв, данные приведенные тут просто примеры}
   Rus: array [0..5] of Char = ('й','ц','у','н','р','ж');


А индекс s[i] с единицы:

if ord(s[i]) = ord(Az[i])


Значит следует изменить индексы массивов:
Az: array [1..4] of Char
Rus: array [1..6] of Char


Сергей М.   (2008-02-22 16:15:00) [9]


> код мой неверный


КТО тебе это сказал ?)


Amoeba   (2008-02-22 15:37:00) [10]

Автору:
При транслитерации всегда одной буквеазербайджанской латиницы соответствует одна буква кириллицы, или может быть сочетание букв?
А почему массивы в приведенном коде разного размера? Может как раз поэтому?


Gauss   (2008-02-22 15:36:00) [11]


> А что, у тебя другая цифирь видна ?)

Нет, соответсвие неполучается, я что-то смудрить немогу с кодом. Ну коды азер-их букв через юникод я знаю , а с кодом вот проблема.


Gauss   (2008-02-22 15:33:00) [12]


> Так излагай !Или сие есть тайна государственного значения
> ?)


Что излагать? код мой неверный, мне нужно исправить, голова моя не варит до правильного кода, вот и обращаюсь к вам)


Сергей М.   (2008-02-22 15:30:00) [13]

Судя по коду - тройку обязан.

А что, у тебя другая цифирь видна ?)


Gauss   (2008-02-22 15:27:00) [14]


> for i := 0 to high(Az) do

а  high(Az)  -- что показывает?


Сергей М.   (2008-02-22 15:27:00) [15]


> факты имеются


Так излагай !

Или сие есть тайна государственного значения ?)


Gauss   (2008-02-22 15:24:00) [16]

факты имеются, результат не получается))


Сергей М.   (2008-02-22 15:22:00) [17]


> я тнт - компонентами пользуюсь


Ну тады ой)


> Токо я знаю что я неправильно код написал


Откуда знаешь ? Это божье откровение ? Или факты имеются ?)


engine   (2008-02-22 15:22:00) [18]

Во-первых, почему азерб. букв три, а русских пять?
Во-вторых, делать надо приблизительно так:
function Transliterate(Source : String) : String;
const
Az : …
Rus : …
var i : Integer;
begin
Result := Source;
for i := 0 to high(Az) do
  Result := StringReplace(Result, Az[i], Rus[i], [rfReplaceAll])
end;


Gauss   (2008-02-22 15:19:00) [19]

я тнт - компонентами пользуюсь! Юникод не проблема)


Johnmen   (2008-02-22 15:16:00) [20]

Ему про Юникод ещё рано...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо