Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];

Вниз

Функция перевода строки из русской в английскую и наоборот.   Найти похожие ветки 

 
Kostik   (2006-01-17 04:27) [0]

Существует ли какая нибудь функция для быстрого перевода троки например "qwerty" в "йцукен", и наоборот???
Мне надо чтобы программа умела переводить  русский текст в английский и наоборот именно вот таким образом. В хелпах ответа не нашел...


 
gdaujk ©   (2006-01-17 08:45) [1]

Стандартной функции, насколько я знаю, нет. Ниже приведённая функция делалась очень давно, возможны недочёты...
const
 EnCH: string = "`qwertyuiop[]asdfghjkl;zxcvbnm,./~!@#$%^&*()_+|QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?";
 RuCH: string = "ёйцукенгшщзхъфывапролджячсмитьбю.Ё!"№;%:?*()_+/ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,";

procedure TForm1.Translate(NowLang,FutureLang: string);
var
 i, j: word;
 Ch: Char;
begin
 Memo2.Text := "";
 for i := 1 to length(Memo1.Text) do
   begin
     Ch := chr(0);
     for j := 1 to Length(NowLang) do
       if NowLang[j] = Memo1.Text[i]
         then
           begin
             Ch := FutureLang[j];
             Break;
           end;
     if Memo1.Text[i] = chr(39) then Ch := "э";
     if Memo1.Text[i] = "э" then Ch := Chr(39);
     if Ch = Chr(0)
       then Ch := Memo1.Text[i];
     Memo2.Text := Memo2.Text + Ch;
   end;
end;


 
gdaujk ©   (2006-01-17 08:47) [2]

Использовать

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 Translate(RuCH,EnCh);
end;


PS: функцию точно надо переделать...


 
Ega23 ©   (2006-01-17 09:37) [3]


> gdaujk ©   (17.01.06 08:45) [1]


"я" и "Я" не учтены


 
msguns ©   (2006-01-17 09:53) [4]

>gdaujk ©   (17.01.06 08:45) [1]

О, боже ! А нельзя ли все эту дребедень выполнить одним оператором в цикле ?


 
Kostik   (2006-01-17 09:57) [5]

>gdaujk
Большое спасибо!!!

А то я тут написал функцию.. Она очень топорная, поскольку я еще мало Делфи занимаюсь...
Вот, потештесь.. )


Function Translete(l:bool; c:char):char;
begin
if l = true then
begin
 if c = char("Q") then c:= char("Й");
 if c = char("W") then c:= char("Ц");
 if c = char("E") then c:= char("У");
 if c = char("R") then c:= char("К");
 if c = char("T") then c:= char("Е");
 if c = char("Y") then c:= char("Н");
 if c = char("U") then c:= char("Г");
 if c = char("I") then c:= char("Ш");
 if c = char("P") then c:= char("З");
 if c = char("{") then c:= char("Х");
 if c = char("S") then c:= char("Ы");
 if c = char("D") then c:= char("В");
 if c = char("F") then c:= char("А");
 if c = char("G") then c:= char("П");
 if c = char("H") then c:= char("Р");
 if c = char("J") then c:= char("О");
 if c = char("K") then c:= char("Л");
 if c = char("L") then c:= char("Д");
 if c = char("Z") then c:= char("Я");
 if c = char("X") then c:= char("Ч");
 if c = char("C") then c:= char("С");
 if c = char("V") then c:= char("М");
 if c = char("B") then c:= char("И");
 if c = char("N") then c:= char("Т");
 if c = char("M") then c:= char("Ь");
 if c = char("<") then c:= char("Б");
 if c = char(">") then c:= char("Ю");
 if c = char(":") then c:= char("Ж");
 if c = char(""") then c:= char("Э");

 if c = char("q") then c:= char("й");
 if c = char("w") then c:= char("ц");
 if c = char("e") then c:= char("у");
 if c = char("r") then c:= char("к");
 if c = char("t") then c:= char("е");
 if c = char("y") then c:= char("н");
 if c = char("u") then c:= char("г");
 if c = char("i") then c:= char("ш");
 if c = char("o") then c:= char("щ");
 if c = char("p") then c:= char("з");
 if c = char("[") then c:= char("х");
 if c = char("]") then c:= char("ъ");
 if c = char("}") then c:= char("Ъ");
 if c = char("a") then c:= char("ф");
 if c = char("s") then c:= char("ы");
 if c = char("d") then c:= char("в");
 if c = char("f") then c:= char("а");
 if c = char("g") then c:= char("п");
 if c = char("h") then c:= char("р");
 if c = char("j") then c:= char("о");
 if c = char("k") then c:= char("л");
 if c = char("l") then c:= char("д");
 if c = char("z") then c:= char("я");
 if c = char("x") then c:= char("ч");
 if c = char("c") then c:= char("с");
 if c = char("v") then c:= char("м");
 if c = char("b") then c:= char("и");
 if c = char("n") then c:= char("т");
 if c = char("m") then c:= char("ь");
 if c = char(",") then c:= char("б");
 if c = char(".") then c:= char("ю");
 if c = char(";") then c:= char("ж");
 if c = char("""") then c:= char("э");
 if c = char("/") then c:= char(".");
 if c = char("?") then c:= char(",");
end;

if l = false then
begin
 if c = char("Й") then c:= char("Q");
 if c = char("Ц") then c:= char("W");
 if c = char("У") then c:= char("E");
 if c = char("К") then c:= char("R");
 if c = char("Е") then c:= char("T");
 if c = char("Н") then c:= char("Y");
 if c = char("Г") then c:= char("U");
 if c = char("Ш") then c:= char("I");
 if c = char("Щ") then c:= char("O");
 if c = char("З") then c:= char("P");
 if c = char("Х") then c:= char("{");
 if c = char("Ъ") then c:= char("}");
 if c = char("Ф") then c:= char("A");
 if c = char("Ы") then c:= char("S");
 if c = char("В") then c:= char("D");
 if c = char("А") then c:= char("F");
 if c = char("П") then c:= char("G");
 if c = char("Р") then c:= char("H");
 if c = char("О") then c:= char("J");
 if c = char("Л") then c:= char("K");
 if c = char("Д") then c:= char("L");
 if c = char("Я") then c:= char("Z");
 if c = char("Ч") then c:= char("X");
 if c = char("С") then c:= char("C");
 if c = char("М") then c:= char("V");
 if c = char("И") then c:= char("B");
 if c = char("Т") then c:= char("N");
 if c = char("Ь") then c:= char("M");
 if c = char("Б") then c:= char("<");
 if c = char("Ю") then c:= char(">");
 if c = char("Ж") then c:= char(":");
 if c = char("Э") then c:= char(""");

 if c = char("й") then c:= char("q");
 if c = char("ц") then c:= char("w");
 if c = char("у") then c:= char("e");
 if c = char("к") then c:= char("r");
 if c = char("е") then c:= char("t");
 if c = char("н") then c:= char("y");
 if c = char("г") then c:= char("u");
 if c = char("ш") then c:= char("i");
 if c = char("щ") then c:= char("o");
 if c = char("з") then c:= char("p");
 if c = char("х") then c:= char("[");
 if c = char("ъ") then c:= char("]");
 if c = char("ф") then c:= char("a");
 if c = char("ы") then c:= char("s");
 if c = char("в") then c:= char("d");
 if c = char("а") then c:= char("f");
 if c = char("п") then c:= char("g");
 if c = char("р") then c:= char("h");
 if c = char("о") then c:= char("j");
 if c = char("л") then c:= char("k");
 if c = char("д") then c:= char("l");
 if c = char("я") then c:= char("z");
 if c = char("ч") then c:= char("x");
 if c = char("с") then c:= char("c");
 if c = char("м") then c:= char("v");
 if c = char("и") then c:= char("b");
 if c = char("т") then c:= char("n");
 if c = char("ь") then c:= char("m");
 if c = char("б") then c:= char(",");
 if c = char("ю") then c:= char(".");
 if c = char("ж") then c:= char(";");
 if c = char("э") then c:= char("""");
 if c = char(".") then c:= char("/");
 if c = char(",") then c:= char("?");
end;

result := c;
end;


 
Johnmen ©   (2006-01-17 09:59) [6]

Напомнило знаменитую IncDay :)))))))))))0


 
Kostik   (2006-01-17 09:59) [7]

с английского на русский


procedure TForm1.Button3Click(Sender: TObject);
var
 i, u : integer;
 s,t : String;
 c : char;
begin

for i := 0 to RichEdit1.Lines.Count-1 do
    begin
     s := RichEdit1.Lines.Strings[i];
     t := "";
     if length(s)>0 then
     for u := 0 to length(s) do
         begin
           c := s[u];
           c := Translete(true, c);
           s[u] := c;
         end;
     RichEdit1.Lines.Strings[i] := s;
    end;
end;


с русского на английской

procedure TForm1.Button4Click(Sender: TObject);
var
 i, u : integer;
 s,t : String;
 c : char;
begin

for i := 0 to RichEdit1.Lines.Count-1 do
    begin
     s := RichEdit1.Lines.Strings[i];
     t := "";
     if length(s)>0 then
     for u := 0 to length(s) do
         begin
           c := s[u];
           c := Translete(false, c);
           s[u] := c;
         end;
     RichEdit1.Lines.Strings[i] := s;
    end;
end;


Спасибо вам большое, помогли!!


 
Kostik   (2006-01-17 10:10) [8]

Только...  почему то моя функция работает быстрее гораздо...  :-[


 
_RusLAN ©   (2006-01-17 10:19) [9]

Kostik   (17.01.06 10:10) [8]
Только...  почему то моя функция работает быстрее гораздо...  :-[


Используй Case  должно еще быстрее ;)


 
Kostik   (2006-01-17 11:46) [10]

Вроде сделал...
Вроде и работает быстро...
*Большое СПАСИБО  gdaujk  за идею... *

Inglish >>  Russian

var
i, u, k: word;
C: Char;
s : String;
begin
RichEdit2.Lines.BeginUpdate;

s := "";
for i := 0 to RichEdit2.Lines.Count-1 do
  begin
    k := 0;
    s := RichEdit2.Lines.Strings[i];

    for u := 1 to Length(s) do
    if pos(char(s[u]), EnCH)<>0 then
     begin
      k := pos(char(s[u]), EnCH);
      C := RuCH[k];
      s[u] := c;
     end;

   RichEdit2.Lines.Strings[i] := s;
  end;

RichEdit2.Lines.EndUpdate;
end;


Russian >>  Inglish

var
i, u, k: word;
C: Char;
s : String;
begin
s := "";
for i := 0 to RichEdit2.Lines.Count-1 do
  begin
    k := 0;
    s := RichEdit2.Lines.Strings[i];

    for u := 1 to Length(s) do
    if pos(char(s[u]), RuCH)<>0 then
     begin
      k := pos(char(s[u]), RuCH);
      C := EnCH[k];
      s[u] := c;
     end;
   RichEdit2.Lines.Strings[i] := s;
  end;
end;


>_RusLAN
А через Case  я что то не очень понял как сделать то...

Большое спасибо ВСЕМ кто откликнулся! Удачи ВАМ ВСЕМ :)


 
Johnmen ©   (2006-01-17 11:54) [11]

Вообще-то, всё это делается, мягко говоря, несколько не так....:)


 
Kostik   (2006-01-17 11:56) [12]

>Johnmen
а как?


 
Anatoly Podgoretsky ©   (2006-01-17 12:02) [13]

Kostik   (17.01.06 10:10) [8]
Вообще то ты себе льстишь


 
Anatoly Podgoretsky ©   (2006-01-17 12:05) [14]

Kostik   (17.01.06 11:56) [12]
С помощью таблицы подстановки и даже функция не нужно
for I := 1 to Length(I) do S[I] := CvtTable[S[I]];
Быстрее этого нельзя.


 
Johnmen ©   (2006-01-17 12:08) [15]

1. Заводится таблица перекодировки. 256 элементов. На каждом месте X в ней указан код символа, в который преобразуется код X.
2. Пробегаем по байтам исходной строки и делаем замену. s[i]:=TBL[x].

Всё...
И не надо никаких pos, if и пр.


 
Игорь Шевченко ©   (2006-01-17 12:51) [16]

Johnmen ©   (17.01.06 12:08) [15]


> Заводится таблица перекодировки. 256 элементов


Особенно значимыми являются первые 32 символа :)


 
Johnmen ©   (2006-01-17 12:56) [17]

>Игорь Шевченко ©   (17.01.06 12:51) [16]

Это чтоб не думать, что там в строке попадётся...:))


 
gdaujk ©   (2006-01-17 12:57) [18]

>Johnmen ©   (17.01.06 11:54) [11]

Я и не настаиваю, что это оптимальный вариант. Говорю же, писал давным давно...


 
Kostik   (2006-01-17 13:11) [19]

>Anatoly Podgoretsky
>for I := 1 to Length(I) do S[I] := CvtTable[S[I]];
>Быстрее этого нельзя.

Что то я не понял как это использовать....
и CvtTable вообще даже в хелпе найти не могу...


 
ANB ©   (2006-01-17 14:02) [20]


> и CvtTable вообще даже в хелпе найти не могу...

CvtTable придется самому нарисовать. Это таблица перекодировки - обычный массив.


 
evvcom ©   (2006-01-17 15:42) [21]


> CvtTable вообще даже в хелпе найти не могу

Anatoly Podgoretsky ©   (17.01.06 12:05) [14] и Johnmen ©   (17.01.06 12:08) [15] говорят об одном и том же. Слей это воедино и поймешь откуда эта CvtTable.


 
Змей ©   (2006-01-19 01:04) [22]

Извините у меня вот не richedit а edit.text
как на ней вот это прокатывать? for i := 0 to RichEdit2.Lines.Count-1 do
:(


 
edit.text   (2006-01-19 03:00) [23]

Вот так:


procedure TForm1.Button3Click(Sender: TObject);
var
i, u, k: word;
C: Char;
s : String;
begin
s := "";
  k := 0;
  s := Edit1.Text;
  for u := 1 to Length(s) do
  if pos(char(s[u]), EnCH)<>0 then
   begin
    k := pos(char(s[u]), EnCH);
    C := RuCH[k];
    s[u] := c;
   end;
 Edit1.Text := s;
end;


 
Змей ©   (2006-01-19 03:44) [24]

thank


 
Fay ©   (2006-01-19 05:01) [25]

2 Kostik   (17.01.06 9:57) [5]
1) Из кода следует, что c и l модет принимать несколько значений одновременно. Это странно.
2) Есть по два результата для одинаковых аргументов (например i = True, c = ";"). Это тоже очень странно.

Учитесь думать головой.


 
AbrosimovA   (2006-01-19 13:29) [26]

const Translit: array[1..33] of string = ("a","b","v","g","d","e","yo",
       "zh","z","i","j","k","l","m","n","o","p","r","s","t","u","f",
       "x","c","ch","sh","sh`","`","y","""","e`","yu","ya");
     Cyrillic: array[1..33] of string = ("а","б","в","г","д","е","ё",
       "ж","з","и","й","к","л","м","н","о","п","р","с","т","у","ф",
       "х","ц","ч","ш","щ","ъ","ы","ь","э","ю","я");

procedure TForm1.mnTransClick(Sender: TObject);
var k: cardinal;
begin
for k:=1 to 33 do
begin
 RichEdt.Lines.Text:=StringReplace(RichEdt.Lines.Text,Cyrillic[k],Translit[k],[rfReplaceAll]);
 RichEdt.Lines.Text:=StringReplace(RichEdt.Lines.Text,AnsiUpperCase(Cyrillic[k]),
  UpperCase(Translit[k]),[rfReplaceAll]);
end
end;


 
Kostik   (2006-01-19 13:39) [27]

>Fay
>1) Из кода следует, что c и l модет принимать несколько значений одновременно. Это странно.
>2) Есть по два результата для одинаковых аргументов (например i = True, c = ";"). Это тоже очень странно.
>Учитесь думать головой.

Поясните пожалуйста, а то я не понял что то... Просто я не так давно занимаюсь делфи...
А головой то я думаю) Не думал бы - не написал бы САМ ничего.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.016 c
2-1137512430
Virtukon
2006-01-17 18:40
2006.02.05
Ускорение процесса добавления текста в TStrings


1-1136730689
Glex
2006-01-08 17:31
2006.02.05
Эмуляция события OnMouseLeave, OnMouseEnter из clx в vcl


2-1137836536
Clock
2006-01-21 12:42
2006.02.05
Часы


8-1124860193
Darkwing
2005-08-24 09:09
2006.02.05
Как устроен визуализатор звуков (например из SoundForge)?


2-1137774738
untitled
2006-01-20 19:32
2006.02.05
string в array of char





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский