Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2013, 01:28   #1
iworm2009
Пользователь
 
Регистрация: 07.05.2013
Сообщений: 51
По умолчанию приведение строки в другую раскладку

Есть задача реализовать функцию в программе в принципе основную какую делает пунтосвитчер
Раскладки всего 2 - русская и английская
например есть у меня строка 'ghbdtn' надо преобразовать в 'привет'
и наоборот строку 'руддщ' преобразовать в 'hello'

на ум пришло создать константу - двумерный [1..66, 0..1] массив и перебирать посимвольно строку.

может это можно сделать как то побайтово?

а может есть еще и более быстрый способ?

ps строка unicode
iworm2009 вне форума Ответить с цитированием
Старый 21.05.2013, 07:59   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
перебирать посимвольно строку.
И
Цитата:
сделать как то побайтово
Это одно и то же. Даже в случа с юникодом это можно отождествить.
Цитата:
есть еще и более быстрый способ?
Ну может http://helpsite.narod.ru/asm/386/8.htm навеет на мысль о скорости...
Но я бы не парился. Неужели у тебя строки по гигабайту, что отказываешся от простого цикла?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.05.2013, 20:08   #3
iworm2009
Пользователь
 
Регистрация: 07.05.2013
Сообщений: 51
По умолчанию

побайтово имелось ввиду функции ord chr.
да, Вы правы строки конечно не более кБ
iworm2009 вне форума Ответить с цитированием
Старый 21.05.2013, 20:12   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Я думаю, гораздо лучший во всех отношениях вариант - завести 2 массива констант длиной по 256 символов (для однобайтовых кодировок), и выбирать символ по индексу без поиска. Примерно так:
const en2ru : array[0..255]of char = (#0,#1,#2...
var MyChar, RecodedChar : char;
...
RecodedChar := en2ru[byte(MyChar)];
s-andriano вне форума Ответить с цитированием
Старый 21.05.2013, 21:12   #5
iworm2009
Пользователь
 
Регистрация: 07.05.2013
Сообщений: 51
По умолчанию

сделал вот так
Код:
{если меняет возвращает true}
function ChangeLang(var bufstr: string): boolean;
const
  rus: array [1..66] of char = ('й', 'ц', 'у', 'к', 'е', 'н', 'г', 'ш', 'щ',
                                'з', 'х', 'ъ', 'ф', 'ы', 'в', 'а', 'п', 'р',
                                'о', 'л', 'д', 'ж', 'э', 'я', 'ч', 'с', 'м',
                                'и', 'т', 'ь', 'б', 'ю', 'ё',
                                'Й', 'Ц', 'У', 'К', 'Е', 'Н', 'Г', 'Ш', 'Щ',
                                'З', 'Х', 'Ъ', 'Ф', 'Ы', 'В', 'А', 'П', 'Р',
                                'О', 'Л', 'Д', 'Ж', 'Э', 'Я', 'Ч', 'С', 'М',
                                'И', 'Т', 'Ь', 'Б', 'Ю', 'Ё');
  eng: array [1..66] of char = ('q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o',
                                'p', '[', ']', 'a', 's', 'd', 'f', 'g', 'h',
                                'j', 'k', 'l', ';', '''', 'z', 'x', 'c', 'v',
                                'b', 'n', 'm', ',', '.', '`',
                                'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O',
                                'P', '{', '}', 'A', 'S', 'D', 'F', 'G', 'H',
                                'J', 'K', 'L', ':', '"', 'Z', 'X', 'C', 'V',
                                'B', 'N', 'M', '<', '>', '~');
var
  i,
  l: integer;
  k: byte;
  isRus,
  isEng: boolean;
  tmp: Char;
begin
  isRus := false;
  isEng := false;
  result := false;
  l := length(bufstr);
  if not l > 0 then
    exit;
  for k := Low(rus) to High(rus) do
    if pos(rus[k], bufstr) <> 0 then
      isRus := true;
  for k := Low(eng) to High(eng) do
    if pos(eng[k], bufstr) <> 0 then
      isEng := true;
  if isRus and isEng then //в строке русский и английский
    exit
  else if isRus and not isEng then  //строка на русском
    for i := 1 to l do
    begin
      k := pos(bufstr[i], rus);
      if k > 0 then
        bufstr[i] := eng[k];
    end
  else if not isRus and isEng then  //строка на англ
    for i := 1 to l do
    begin
      k := pos(bufstr[i], eng);
      if k > 0 then
        bufstr[i] := rus[k];
    end;
  result := true;
end;
iworm2009 вне форума Ответить с цитированием
Старый 21.05.2013, 21:34   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
сделал вот так
Логично. Только код медленный все равно.
pos() тут абсолютно как не пришей рукав пятому зайцу.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.05.2013, 21:54   #7
iworm2009
Пользователь
 
Регистрация: 07.05.2013
Сообщений: 51
По умолчанию

Да я и не спорю что он быстрый. Если бы знал как, не спрашивал совета. Мне на ум алгоритма не приходит, поэтому вот такая логика, а что c Pos() и с каким(и)?
iworm2009 вне форума Ответить с цитированием
Старый 21.05.2013, 22:01   #8
iworm2009
Пользователь
 
Регистрация: 07.05.2013
Сообщений: 51
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Я думаю, гораздо лучший во всех отношениях вариант - завести 2 массива констант длиной по 256 символов (для однобайтовых кодировок), и выбирать символ по индексу без поиска. Примерно так:
const en2ru : array[0..255]of char = (#0,#1,#2...
var MyChar, RecodedChar : char;
...
RecodedChar := en2ru[byte(MyChar)];
Вас вообще не понял
iworm2009 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переход с одной строки на другую в DBF сканировании danxiel Помощь студентам 2 04.09.2012 14:15
MS SQL SERVER 2005 копирование таблицы из ОДНОЙ БД В другую или перенести все строки из одной таблицы в другую reihtmonbern БД в Delphi 4 17.07.2012 23:25
Перенос данных из строки одной таблицы БД в другую БД Optigood БД в Delphi 15 12.05.2010 17:07
ActionScript копировать часть строки в другую пауэрлифтинг JavaScript, Ajax 0 15.12.2009 21:34
функция: копирование части строки в другую строку plasticman Microsoft Office Excel 1 18.03.2009 15:30