![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Замена русских букв на латинские [D7, XP]
санек © (2013-08-08 14:38:00)Здравствуйте, Уважаемые мастера программирования!
Помогите решить задачу
Есть Слово на русском языке. Нужно заменить его тем же словом но латинскими буквами. Например "машина" заменить на "mashina".
Все бы хорошо, но вот когда с русском слове встречаются буквы, которые заменяются 2-мя латинскими буквами появляется проблема.
Спасибо
Плохиш (2013-08-09 21:23:00) [1]Вопрос к делфи отношения не имеет.
Руководствоваться необходимо личными предпочтениями ;-)
Inovet (2013-08-09 17:44:00) [2]Вот интересный вопрос: как праильно транслитерировать
ШИЛО - ShILO, SHILO
?
А если
ШиЛО, МИЖ, МиЖ?
[ВладОшин] (2013-08-09 16:20:00) [3]
> Sha © (09.08.13 16:06) [13]
так надо было:)
это хлеб черный, (если за белый принять Плохиш © (09.08.13 11:19) [11]
Тяпница, можно и подать)
Sha (2013-08-09 16:06:00) [4]> [ВладОшин]
разные щ и Щ
[ВладОшин] (2013-08-09 12:32:00) [5]function TfrmForTechSup.TranslitRus2Lat(const Str: string): string;
const
RArrayL = 'абвгдеёжзийклмнопрстуфхцчшщьыъэюя';
RArrayU = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ';
colChar = 33;
arr: array[1..2, 1..ColChar] of string =
(('a', 'b', 'v', 'g', 'd', 'e', 'yo', 'zh', 'z', 'i', 'y',
'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f',
'kh', 'ts', 'ch', 'sh', 'shch', '''', 'y', '''', 'e', 'yu', 'ya'),
('A#', 'B#', 'V#', 'G#', 'D#', 'E#', 'YO', 'ZH', 'Z#', 'I#', 'Y#',
'K#', 'L#', 'M#', 'N#', 'O#', 'P#', 'R#', 'S#', 'T#', 'U#', 'F#',
'KH', 'TS', 'CH', 'SH', 'SH', '''', 'Y#', '''', 'E#', 'YU', 'YA'));
var
i: Integer;
LenS: Integer;
p: integer;
d: byte;
begin
result := '';
LenS := length(str);
for i := 1 to lenS do
begin
d := 1;
p := pos(str[i], RArrayL);
if p = 0 then
begin
p := pos(str[i], RArrayU);
d := 2
end;
if p <> 0 then
result := result + arr[d, p]
else
result := result + str[i]; //если не русская буква, то берем исходную
end;
end;
Плохиш (2013-08-09 11:19:00) [6]Тяпница, можно и подать
const
RusToTranslit: array[$00..$51] of String =
// x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
('', 'Jo', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
'A', 'B', 'V', 'G', 'D', 'E', 'Zh', 'Z', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'R', 'S', 'T', 'U', 'F', 'H', 'C', 'Ch', 'Sh', 'Shh', '#', 'Y', '''', 'Je', 'Ju', 'Ja',
'a', 'b', 'v', 'g', 'd', 'e', 'zh', 'z', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'shh', '#', 'y', '''', 'je', 'ju', 'ja',
'', 'jo'
);
function WideCharToChar(const WCh: WideChar): String;
var
wcTmp: Array[0..1] of WideChar;
begin
if (Hi(Integer(WCh)) = $04) and
((Lo(Integer(WCh)) > $00) and (Lo(Integer(WCh)) <= $51)) then
begin
Result := RusToTranslit[Lo(Integer(WCh))];
end
else
begin
wcTmp[0] := WCh;
wcTmp[1] := #0;
Result := WideCharToString(@wcTmp);
end;
end;
function WideStringToTranslit(const WString: WideString): String;
var
lIndex: Integer;
begin
Result := '';
for lIndex := 1 to Length(WString) do
Result := Result + WideCharToChar(WString[lIndex]);
end;
санек (2013-08-09 10:47:00) [7]Все Спасибо пацаны. Все разобрался. Через while сделал
Anatoly Podgoretsky (2013-08-08 18:40:00) [8]
> Есть ли для поиска строки в строке без учета регистра?
Так и будешь скрывать СУБД
Вова (2013-08-08 16:58:00) [9]AnsiCompareText Сравнивает две строки без учета регистра, но с учетом языковых особенностей Windows.
Вова (2013-08-08 16:56:00) [10]http://delphibasics.ru/AnsiUpperCase.php
Вова (2013-08-08 16:54:00) [11]есть функции приведения строки к одному регистру. Кажется.
санек (2013-08-08 15:43:00) [12]Все разобрался.
Вот так
for n:=1 to Length(FIO_r) do
begin
if FIO_r[n]='Ш' then
begin
FIO_r[n]:='S';
Insert(' ',FIO_r,n+1);
FIO_r[n+1]:='h';
end;
end;
А вот как быть с регистром букв?
Есть ли для поиска строки в строке без учета регистра?
Anatoly Podgoretsky (2013-08-08 15:07:00) [13]Да хоть на четыре.
> if rus[i]='ш' then lat[i]:='sh' но так ведь нельзя.
Да так нельзый и она должна изменить или ты считаешь что две буквы занимают ровно столько места, что и одна
санек (2013-08-08 14:55:00) [14]Я заменяю так
lan:=rus;
if rus[i]='с' then lat[i];='s'.
Но если попадается одна из тех букв то мне получается надо
if rus[i]='ш' then lat[i]:='sh'но так ведь нельзя.
и если делатьif rus[i]:='ш' then begin lat[i]:='s'; lat[i+1]:='h'
и тогда меняется длина строки lat
Вова (2013-08-08 14:49:00) [15]создаешь таблицу соответствий. Каждому русскому символу пишешь в соответствие набор (или одну) английских и заменяешь по таблице.
брат Птибурдукова (2013-08-08 14:41:00) [16]
> появляется проблема
какая?