Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.23;
Скачать: CL | DM;

Вниз

Что-то вроде транслитератора.   Найти похожие ветки 

 
Gauss ©   (2008-02-22 15:11) [0]

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

Имеется форма, а на ней 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.

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


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


> текст в Memo1.. под юникод


С каких пор TMemo умеет работать с Юникодом ?


 
Johnmen ©   (2008-02-22 15:16) [2]

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


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

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


 
engine ©   (2008-02-22 15:22) [4]

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


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


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


Ну тады ой)


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


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


 
Gauss ©   (2008-02-22 15:24) [6]

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


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


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


Так излагай !

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


 
Gauss ©   (2008-02-22 15:27) [8]


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

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


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

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

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


 
Gauss ©   (2008-02-22 15:33) [10]


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


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


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


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

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


 
Amoeba ©   (2008-02-22 15:37) [12]

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


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


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


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


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

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


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


 
Gauss ©   (2008-02-22 23:10) [15]

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


 
gauss ©   (2008-02-23 21:59) [16]

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

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.



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


 
TMemo   (2008-02-23 23:02) [17]

Если заполнить 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 обычные, не юникодовские.


 
korneley ©   (2008-02-24 08:20) [18]

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

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


 
korneley ©   (2008-02-24 08:27) [19]

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


 
Gauss ©   (2008-02-24 22:54) [20]


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


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


 
Gauss ©   (2008-02-25 12:20) [21]

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


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



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

Текущий архив: 2008.03.23;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.017 c
3-1193829886
adamas
2007-10-31 14:24
2008.03.23
Клонирование набора данных!


2-1203676312
Чародей
2008-02-22 13:31
2008.03.23
Потокобезопасность


2-1203489060
Максим
2008-02-20 09:31
2008.03.23
разбор строка


2-1204008466
boba
2008-02-26 09:47
2008.03.23
TCriticalSection


2-1203878639
NieL
2008-02-24 21:43
2008.03.23
Transparency