Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Замена русских букв на латинские [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]


> появляется проблема
какая?


Наверх

Титульная страница Поиск, карта сайта Написать письмо