Форум: "Основная";
Текущий архив: 2002.06.13;
Скачать: [xml.tar.bz2];
ВнизБратцы, помогите дописать ф-ю перевода рус.б. в транслитерацию, Найти похожие ветки
← →
Yuraz (2002-06-01 16:57) [0]всё готово, кроме отфильтровывания любых не буквенных символов. Т.е. буквы меняются нормально, а вот при встече с запятой, точкой и т.д. т.п. нужно что бы этот самый (отличный от буквы) символ менялся на "_" (нижнюю черту).
function RusToEng(s1: string): string;
const
eng: Array[1..60] of String =
("_","a", "b", "v", "g", "d", "e", "e", "g", "z", "i", "i", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "c", "ch", "sh", "sh", "", "i", "", "e", "u", "ia", "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");
rus: Array[1..60] of String =
(" ","а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ь", "ы", "ъ", "э", "ю", "я", "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");
var
i, j, ind, k: integer;
scratch: string;
begin
s1:=AnsiLowerCase(s1);
scratch := "";
i := length(s1);
if i > 0 then
for j := 1 to i do
begin
// находим индекс буквы
ind := 0;
for k := 1 to 60 do
if s1[j] = rus[k] then
begin
ind := k;
break;
end; // if
scratch := scratch + eng[ind];
end; // for
Result := scratch;
end;
← →
Magic (2002-06-01 17:05) [1]Самое простое - использовать принцип конечного аппарата. Если ты о нем знаеш. Т.к. тебе нужно сделать простой лексический анализатор.
← →
Yuraz (2002-06-01 17:16) [2]Я не могу разобраться как написать проверку, то что нет этой буквы в списке. И куда вставить. Понимаю, что это как то коротко и красиво получается, но дойти сам не могу.
← →
VID (2002-06-01 17:33) [3]to SubjAutor: не понятно, какго фига в массиве русских букв, у тебя находятся латинские ... ладно фиг с ними.
function CharFilter(InString:String):String;
Const symb = ",.;:!@#$%^&*()+-=/]}[{`~\|<>"+#39;
var I:Integer;
begin
Result := InString;
IF Length(InString)=0 then Exit;
FOR I:=1 to length(InString) do
IF Pos(InString[I], symb)>0 then Result[i]:="_";
end;
Всё. Просто и наглядно.
← →
-=Sergeante=- (2002-06-01 18:22) [4]
Procedure TForm1.TranslitRus2Eng;
const
colChar=32;
arr:array[1..2,1..ColChar] of string=
(("А","Б","В","Г","Д","Е","Ё","Ж" ,"З","И","Й","К","Л","М","Н","О","П","Р","С","Т","У","Ф","Х", "Ц", "Ч", "Ш", "Щ", "Ь", "Ы",{"Ъ",}"Э","Ю", "Я"),
("A","B","V","G","D","E","E","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 s:String;
i,j,k,c:Integer;
LenS:Integer;
Finded:Boolean;
begin
mTo.lines.Clear;
s:="";
c:=mFrom.lines.count-1;
for k:=0 to c do
begin
LenS:=length(mFrom.lines[k]);
s:="";
for i:=1 to lenS do
begin
for j:=1 to colchar do
if (mFrom.lines[k][i]=arr[1,j]) then
begin
s:=s+arr[2,j];
finded:=True;
break
end else if (mFrom.lines[k][i]=AnsiLowerCase(arr[1,j])) then
begin
s:=s+AnsiLowerCase(arr[2,j]);
finded:=True;
break
end else finded:=False;
if not finded then s:=s+mFrom.lines[k][i];
end;//for
mTo.lines.add(s);
end;//for k
end;
Поставить условие на знак препинания, думаю, тут не составит труда. Все рус. буквы транслитеруются по стандарту.
← →
Magic (2002-06-01 19:37) [5]Еще один способ:
const
BedSimbols: set of = [<все не нужные тебе символы>];
а потом проверяй
var
Ch: char;
...
if Ch in BedSimbols then ...;
вот и вся проверка.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.06.13;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c