![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что-то вроде транслитератора.
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]Ему про Юникод ещё рано...