Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Вниз

Транслит   Найти похожие ветки 

 
Greenchel ©   (2006-11-08 22:06) [0]

Существует строка вида: Ghbdtn
Как перевести в нормальный вид?


 
Dmitrij_K   (2006-11-08 22:15) [1]

что значит "нормальный"???


 
Greenchel ©   (2006-11-08 22:17) [2]

Ghbdtn = Привет
Gjrf = Пока
(Руские слова написаны английскими буквами)


 
Desdechado ©   (2006-11-08 22:20) [3]

Это НЕ транслит.
Транслит - это vot takie slova.
А у тебя что-то не то.
Хотя можешь составить таблицу соответствия. Но помни, чтоне у всех qwerty-клавиатуры.


 
Greenchel ©   (2006-11-08 22:22) [4]

В общем во всех чатах такая вещь именуется "2RUS".
Насколько мне известно надо создать массив, а затем согласно массиву заменять буквы:
"Q" => "Й"
"W" => "Ц"
"E" => "У" и т.д.
Вот как реализовать вот эту замену?


 
Percent   (2006-11-08 22:35) [5]

Вот как реализовать вот эту замену?

надо создать массив, а затем согласно массиву заменять буквы


 
Greenchel ©   (2006-11-08 22:37) [6]


> надо создать массив, а затем согласно массиву заменять буквы

я тоже самое написал выше :)
Кто-нибудь может хотя-бы на примере 1 буквы показать метод реализации?


 
Desdechado ©   (2006-11-08 22:45) [7]

> Кто-нибудь может
Может.

А ты не хочешь изложить код СВОИХ попыток?


 
Percent   (2006-11-08 22:46) [8]

я тоже самое написал выше

Я скопировал.

Кто-нибудь может хотя-бы на примере 1 буквы показать метод реализации?

Ты же правильно все написал.
Реализовывай.
Что-то не получится - спрашивай.
А ты, я так понимаю, хочешь, чтобы за тебя это сделал кто-то другой.

Подсказка: Задай матрицу трансформации символов [0..1, 0..104], где 0..1 - количество вариантов, 0..104 - количество клавиш на 105 кнопочной клавиатуре (их в твоей программе будет меньше - тебе же не надо обрабатывать несимвольные клавиши); числа могут отличаться, в зависимости от твоих потребностей. Когда надо будет преобразовать строку, в цикле пройдись по всем символам этой строки, и для каждого символа найди соответствие в матрице трансформации, а потом замени символ в строке на ассоциированный  символ.


 
Percent   (2006-11-08 22:47) [9]

тебе же не надо обрабатывать несимвольные клавиши

читать как "тебе же не надо обрабатывать символьные клавиши"


 
Greenchel ©   (2006-11-08 22:50) [10]

Ок, попробую сейчас


 
Greenchel ©   (2006-11-08 23:09) [11]

var ru: array[1..33] of string;
en: array[1..33] of string;
begin
ru[1]:= "q";
ru[2]:= "w";
ru[3]:= "e";
ru[5]:= "r";
ru[6]:= "t";
ru[7]:= "y";
ru[8]:= "u";
ru[9]:= "i";
ru[10]:= "o";
ru[11]:= "p";
ru[12]:= "[";
ru[13]:= "]";
ru[14]:= "a";
ru[15]:= "s";
ru[16]:= "d";
ru[17]:= "f";
ru[18]:= "g";
ru[19]:= "h";
ru[20]:= "j";
ru[21]:= "k";
ru[22]:= "l";
ru[23]:= ";";
ru[24]:= """;
ru[25]:= "z";
ru[26]:= "x";
ru[27]:= "c";
ru[28]:= "v";
ru[29]:= "b";
ru[30]:= "n";
ru[31]:= "m";
ru[32]:= ",";
ru[33]:= "`";
end;

Создал такой массив, а он не хочет пропускать ru[24], в чём дело? :(


 
Percent   (2006-11-08 23:14) [12]

Потому что у тебя там кавычка незакрытая.
Напиши:

ru[24]:= """"; {четыре одиночных кавычки}


 
Greenchel ©   (2006-11-08 23:15) [13]

так мне это... на знаке <"> буква <Э>


 
Percent   (2006-11-08 23:17) [14]

И еще.
Используй константный массив.
Типа такого:

const
 Digits: array[0..9] of Char = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");


(С) Borland Delphi Help


 
Percent   (2006-11-08 23:19) [15]

Так и задавай русские буквы в массиве ru, а английские - в массиве en.

en[24] := """";
ru[24] := "э";


 
Percent   (2006-11-08 23:22) [16]

И лучше использовать ASCII коды в качестве индексов массива. Один массив для преобразования ru -> en. Другой - для en -> ru. Тогда поиска не надо будет. Код символа будет индексом.


 
Percent   (2006-11-08 23:24) [17]

То есть, не ASCII, а ANSI, русскую кодировку, или Windows-1251, что почти то же, что и ANSI...


 
Ketmar ©   (2006-11-09 01:02) [18]

>[14] Percent 8-Nov-2006, 23:17
>Используй константный массив.
>Типа такого:
const
Digits: array[0..9] of Char = "0123456789";

%-)

и всё равно неправильно. правильно -- это API. и на основе скан-кодов преобразовывать.


 
API ©   (2006-11-09 09:48) [19]

правильно -- это API.

Звали?

на основе скан-кодов преобразовывать

Ну и какой тогда будет алгоритм преобразования строки "йцукен" в строку "qwerty"?


 
Anatoly Podgoretsky ©   (2006-11-09 09:53) [20]

> API  (09.11.2006 09:48:19)  [19]

Простой ch := Tbl[Ch];


 
API ©   (2006-11-09 10:07) [21]

ch := Tbl[Ch];

Ch - не является скан-кодом клавиатуры (как посоветовано в [18])...
Да и регистр при использовании скан-кодов теряется...


 
Anatoly Podgoretsky ©   (2006-11-09 10:25) [22]

> API  (09.11.2006 10:07:21)  [21]

> Ch - не является скан-кодом клавиатуры

Ch - является идентификатором.


 
Anatoly Podgoretsky ©   (2006-11-09 10:27) [23]


> и на основе скан-кодов преобразовывать

А знание какому скан-коду соответствует тот или другой символ, он откуда возьмет.


 
Anatoly Podgoretsky ©   (2006-11-09 10:31) [24]

> API  (09.11.2006 10:07:21)  [21]

Я бы не советовал использовать скан коды, да и откуда они у автора, у него есть строка. Значит работать со значениями символов, а это одна строка кода.


 
API ©   (2006-11-09 10:58) [25]

Я бы не советовал использовать скан коды

Я - тоже.
Это просто был "наш ответ Чемберлену", то есть, на [18]...


 
Anatoly Podgoretsky ©   (2006-11-09 11:11) [26]

API ©   (09.11.06 10:58) [25]
Это я понял, в любом случае неодназначность, как с кодами, так и символами - это надо отдать на откуп пользователю.


 
Ketmar ©   (2006-11-09 12:07) [27]

>[19] API(c) 9-Nov-2006, 09:48
>Ну и какой тогда будет алгоритм преобразования строки "
>йцукен" в строку "qwerty"?
именно тот, который успешно используется в моём переключателе раскладок.

>[23] Anatoly Podgoretsky(c) 9-Nov-2006, 10:27
>А знание какому скан-коду соответствует тот или другой
>символ, он откуда возьмет.
это винда знает. она умная.

>[24] Anatoly Podgoretsky(c) 9-Nov-2006, 10:31
>Я бы не советовал использовать скан коды, да и откуда они
>у автора, у него есть строка.
а ещё есть OS Windows и её API.

>[25] API(c) 9-Nov-2006, 10:58
>Я - тоже.
ну-ну. а о том, что клавиатуры -- они не только стандарта "qwerty" бывают -- осведомлён?

>[26] Anatoly Podgoretsky(c) 9-Nov-2006, 11:11
>Это я понял, в любом случае неодназначность, как с кодами,
>так и символами - это надо отдать на откуп пользователю.
а не операционке? кому, как не ей лучше знать соответствия?


 
Anatoly Podgoretsky ©   (2006-11-09 12:15) [28]

> Ketmar  (09.11.2006 12:07:27)  [27]

> а ещё есть OS Windows и её API.

И чем оно поможет

> Существует строка вида: Ghbdtn


 
Ketmar ©   (2006-11-09 12:47) [29]

>[28] Anatoly Podgoretsky(c) 9-Nov-2006, 12:15
Ghbdtn=Привет

вот этот "Привет" только что был перекодирован моим переключателем раскладок. никаких таблиц перекодировки в нём нет. ему вообще плевать на таблицы и установленые языки, он clipboard из предыдущей раскладки переводит в текущую. всё.


 
Anatoly Podgoretsky ©   (2006-11-09 12:56) [30]


> он clipboard из предыдущей раскладки переводит в текущую.
>  всё.

Ух ты какой хитрый, я бы не догадался так сделать.


 
Ketmar ©   (2006-11-09 13:05) [31]

>[30] Anatoly Podgoretsky(c) 9-Nov-2006, 12:56
>Ух ты какой хитрый, я бы не догадался так сделать.
я бы тоже. юзер пинал. %-)


 
Anatoly Podgoretsky ©   (2006-11-09 13:20) [32]

Неординарный подход.
Насколько эффективно на разных локализациях?


 
Reindeer Moss Eater ©   (2006-11-09 13:23) [33]

Выставить старший бит у каждого "английского"  символа в 1.
Получим русский текст в koi8r
Далее делаем перекодировку в 1251 и - вуаля.


 
*Стажер*   (2006-11-09 13:26) [34]

program Layout;

uses
 windows, Messages, ShellApi, SysUtils, Clipbrd;

{$R *.RES}

const CharEngRus: array [32..126] of byte =
($20,$21,$DD,$B9,$3B,$25,$3F,$FD,$28,$29,$2A,{*}
$2B,$E1,$2D,$FE,$2E,$30,$31,$32,$33,$34,$35, {5}
$36,$37,$38,$39,$C6,$E6,$C1,$3D,$DE,$2C,$22,{@}
$D4,$C8,$D1,$C2,$D3,$C0,$CF,$D0,$D8,$CE,$CB,{K}
$C4,$DC,$D2,$D9,$C7,$C9,$CA,$DB,$C5,$C3,$CC, {V}
$D6,$D7,$CD,$DF,$F5,$5C,$FA,$3A,$5F,$B8,$F4,{a}
$E8,$F1,$E2,$F3,$E0,$EF,$F0,$F8,$EE,$EB,$E4,{l}
$FC,$F2,$F9,$E7,$E9,$EA,$FB,$E5,$E3,$EC,$F6,{w}
$F7,$ED,$FF,$D5,$2F,$DA,$A8 );

var
WindowHandle, EditHandle: HWnd;
Instance: HWnd; {дескриптор модуля приложения}
WindowClass: TWndClass;  {класс окна приложения}
FHandle: HWnd;  {дескриптор окна приложения}
mesg: TMsg; {сообщения приложения}
 Ico_Message: integer=wm_User; {сообщение от иконки окну}
noIconData: TNotifyIconData; {дескриптор структуры NotifyIconData}
HIcon1: hIcon; {дескриптор иконки}
 stClb:string;
 pstw:PWideChar;
 stw:WideString;
 stSize,i,n:integer; {размер строки и счетчики}
Version: TOSVersionInfo;
stHdl: THandle;
stPtr: Pointer;

function WindowProc (Hwn,msg,wpr,lpr: longint): longint; stdcall;
{обработка сообщений}
begin
 result:=defwindowproc(hwn,msg,wpr,lpr); {ищет стандартный обработчик}

 if Msg = wm_Destroy then  {если команда на закрытие}
 begin
       Shell_NotifyIcon(NIM_Delete,@noIconData); {удаляем иконку}
       UnregisterHotKey(FHandle, 1); {убираем горячую клавишу}
       halt; {закрываем программу}
 end;

 if Msg = Ico_Message then  {если это сообщение от иконки}
 begin
   if lpr=WM_RBUTTONUP then {была отпущена левая кнопка}
   begin
     if MessageBox(FHandle,"Вы хотите закрыть программу Layout?",
     "Warning",MB_YESNO)=idYES then
     begin
       Shell_NotifyIcon(NIM_Delete,@noIconData); {удаляем иконку}
       UnregisterHotKey(FHandle, 1); {убираем горячую клавишу}
       halt; {закрываем программу}
     end;
   end;
 end;

 if Msg = WM_HOTKEY then  {если нажата горячая клавиша}
 if wpr=1 then {и ее номер 1}
 begin
   WindowHandle := GetForegroundWindow;  {активное окно}
   EditHandle := GetTopWindow(WindowHandle); {активный элемент}
        keybd_event(VK_CONTROL,0,0,0); { нажатие клавиши Ctrl}
        keybd_event(ord("C"),0,0,0); {нажатие клавиши "C"}
        keybd_event(ord("C"),0,KEYEVENTF_KEYUP,0); {отпускание "C"}
        keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0); {отпускание Ctrl }
        SendMessage(EditHandle,WM_COMMAND, $00010043, $00000000); {ускоритель}
   Sleep(100);
   Clipboard.Open;
   if Clipboard.HasFormat(CF_UNICODETEXT) then
   begin
      stHdl:=Clipboard.GetAsHandle(CF_UNICODETEXT);
      stPtr:=GlobalLock(stHdl);
      pstw:=stPtr;
      stw:=pstw;
      GlobalUnlock(stHdl);
      stClb:=stw;
   end
   else stClb:=Clipboard.AsText; {забрали в строку чистый текст}
      if stClb="" then exit; {на случай, если в буфере пусто}
      i:=1; {ищем первый буквенный символ}
      while (not (stClb[i] in ["A".."Z"])) and (not (stClb[i] in ["a".."z"])) and
      (not (stClb[i] in ["А".."я"])) do
      begin i:=i+1; if i>length(stClb) then exit end; {если ни одного буквенного символа, то на выход}
             {определям раскладку по найденному буквенному символу:}
      if (stClb[i] in ["A".."Z"]) or (stClb[i] in ["a".."z"])
      then {то это английский}
      begin
         for n:=1 to length(stClb) do
         if (ord(stClb[n])>=32) and (ord(stClb[n])<=127) then
         stClb[n]:=chr(CharEngRus[ord(stClb[n])]); {заменяем символом из таблицы}
      end
      else {это русский}
      begin
        for n:=1 to length(stClb) do
        for i:=32 to 126 do
        begin   {обратный поиск по таблице}
          if ord(stClb[n])=CharEngRus[i] then
          begin stClb[n]:=chr(i); break; end;
        end;
      end;
   Version.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
   GetVersionEx(Version);
   if Version.dwPlatformId = VER_PLATFORM_WIN32_NT then
   begin {это NT}
     with Clipboard do
     begin
        stSize:=length(stClb)*sizeof(WideChar)+2; {длина строки в Unicode}
        stHdl:=GlobalAlloc(GMEM_MOVEABLE,stSize); {отводим память в куче}
        stPtr:=GlobalLock(stHdl); {указатель на эту память}
        MultiByteToWideChar(CP_ACP,0,PChar(stClb),Length(stClb),stPtr,stSize);
                                     {преобразуем в Unicode}
        Clear; {очищаем буфер}
        Clipboard.SetAsHandle(CF_UNICODETEXT,stHdl); {забираем в него}
        GlobalUnlock(stHdl);
        GlobalFree(stHdl);   {очищаем память}
     end;
   end else {это 9х}
   Clipboard.AsText:=stClb; {просто забрали обратно в буфер}
   Clipboard.Close;
      {вставляем поверх выделенного:}
      keybd_event(VK_CONTROL,0,0,0); { нажатие клавиши Ctrl}
      keybd_event(ord("V"),0,0,0); {нажатие клавиши "V"}
      keybd_event(ord("V"),0,KEYEVENTF_KEYUP,0); {отпускание "V"}
      keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0); {отпускание Ctrl }
      SendMessage(EditHandle,WM_COMMAND, $00010043, $00000000); {ускоритель}
 end {hotkey}
end;

procedure CreateMyicon;
begin
 HIcon1:=LoadIcon(Instance,"MAINICON"); {получаем дескриптор иконки}
with noIconData do begin
 cbSize:=Sizeof(TNotifyIconData); {размер структуры}
 Wnd:=FHandle; {дескриптор окна}
 uID:=0; {единственная иконка}
 UFlags:=NIF_MESSAGE or NIF_ICON or NIF_TIP; {взводим все флаги}
 SzTip:="Language Layout"; {всплывающая подсказка}
 HIcon:=HIcon1; {дескриптор иконки}
 uCallBackMessage:=Ico_Message;{oпределяемое пользователем сообщение}
end;
Shell_NotifyIcon(NIM_ADD,@noIconData); {создали иконку}
end;

begin
instance :=GetModuleHandle(nil); {получаем дескриптор модуля}
with WindowClass do {задаем свойства окна}
begin
     style:=CS_HRedraw or CS_VRedraw;
     Lpfnwndproc:=@windowproc;
     Hinstance:=Instance;
     HbrBackground:= color_btnface;
     LpszClassName:="DX";
     Hcursor:=LoadCursor(0,IDC_ARROW);
     hIcon:=LoadIcon(Instance,"MAINICON");
end;

RegisterClass(WindowClass);  {регистрируем класс}

FHandle:=CreateWindowEx (0,"DX","",WS_POPUP, 5,5, 200, 200,0,0,instance, nil);
{получаем дескриптор окна}

RegisterHotKey(FHandle, 1 ,MOD_CONTROL, vk_F12); {регистрируем клавишу Ctrl-F12}

CreateMyicon; {создаем иконку}

while (GetMessage(mesg, 0, 0, 0)) do  {обработка сообщений}
 begin
  TranslateMessage(mesg);
  DispatchMessage (mesg);
 end;
end.


 
*Стажер*   (2006-11-09 13:27) [35]


> [34]

Пример надыбанный, не помню откуда


 
Ketmar ©   (2006-11-09 13:32) [36]

>[32] Anatoly Podgoretsky(c) 9-Nov-2006, 13:20
>Насколько эффективно на разных локализациях?
честно признаться, не знаю. судя по моим тестам (далеко не полным) -- перекодировка из $419 в $409 и назад работает стабильно, если обе установлены. %-) какая локаль винды при этом -- не важно.
по идее должно работать между любыми локалями -- никаких причин для глюков не вижу. кроме, правда, диакритических символов, набираемых несколькими нажатиями. на это я злобно положил. %-)
впрочем, для решения [0] способ вполне подходящий.

>[33] Reindeer Moss Eater(c) 9-Nov-2006, 13:23
???


 
Reindeer Moss Eater ©   (2006-11-09 13:36) [37]

>[33] Reindeer Moss Eater(c) 9-Nov-2006, 13:23
???


Да вроде все верно.
кои8р был придуман спецом для борьбы с почтовыми серверами откусывающими старший бит у символов письма.
Если в письме есть русская "Р" то после откусывания старшего бита она превратится в латинскую "Р" и текст останется читабельным.

Я же просто предложил проделать обратное.


 
han_malign ©   (2006-11-09 13:38) [38]

VkKeyScanEx
MapVirtualKeyEx


 
Anatoly Podgoretsky ©   (2006-11-09 13:59) [39]


> Reindeer Moss Eater ©   (09.11.06 13:36) [37]

Это легенда, а правда такая - был KOI-7 а KOI-8 сделан по анологии, но так как стыдно было признаться, то была придумана легенда.


 
Reindeer Moss Eater ©   (2006-11-09 14:13) [40]

рабочая легенда

win-1251 : "привет мир!"

Преобразуем в кои8-р
и далее каждому байту делаем and $7F

Получаем "PRIWET MIR!"



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.046 c
2-1163174164
Fostr
2006-11-10 18:56
2006.11.26
Syntax error in query. Incomplete query clause.


15-1163074736
Riply
2006-11-09 15:18
2006.11.26
BDS 2006 Переход в редакторе кода на определение объекта.


15-1162882336
Тульский
2006-11-07 09:52
2006.11.26
С праздником, товарищи!


6-1152000505
Ildar
2006-07-04 12:08
2006.11.26
NetShareAdd используя 502 структуру


1-1160768320
guav
2006-10-13 23:38
2006.11.26
Преобразование вариантных типов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский